从列表中删除重复值的最佳算法

2024-04-08

从列表中删除重复值的最佳算法是什么? 我试过这个:

for (int i = 0; i < AuthorCounter-1; i++)
{
    for (int j = 0; j < AuthorCounter-1; j++)
    {
        if (i != j)
        {
            if (AuthorGroupNode.Nodes[i].Text == AuthorGroupNode.Nodes[j].Text)
            {
                AuthorGroupNode.Nodes[j].Remove();
                AuthorCounter--;
            }

        }
    }
}

Here, AuthorGroupNodes是节点上的列表。它在某种程度上做对了事情,但并不完美。大家有更好的解决办法吗???


您当前的算法是 O(N-squared),对于大型列表来说其性能会很差。

如果空间不是问题,您可以保留一个HashSet<int>节点的哈希值。遍历列表一次。如果该节点的哈希值在 HashSet 中,则您知道这是一个重复节点。跳过它。如果该hash不在HashSet中,则将此节点添加到一个新列表中,并将该节点的hash添加到HashSet中。

这将执行 O(N),并且需要用于原始列表、列表的副本(减去任何重复项)以及 HashSet 的内存。该算法是非破坏性的。

如果您可以使用 Linq,只需执行以下操作

var distinctList = originalList.Distinct().ToList();

UPDATE

发现这几乎正是 Jon Skeet 重新实现 Distinct 的方式。

public static IEnumerable<TSource> Distinct<TSource>( 
    this IEnumerable<TSource> source) 
{ 
    return source.Distinct(EqualityComparer<TSource>.Default); 
} 

public static IEnumerable<TSource> Distinct<TSource>( 
    this IEnumerable<TSource> source, 
    IEqualityComparer<TSource> comparer) 
{ 
    if (source == null)  
    { 
        throw new ArgumentNullException("source"); 
    } 
    return DistinctImpl(source, comparer ?? EqualityComparer<TSource>.Default); 
} 

private static IEnumerable<TSource> DistinctImpl<TSource>( 
    IEnumerable<TSource> source, 
    IEqualityComparer<TSource> comparer) 
{ 
    HashSet<TSource> seenElements = new HashSet<TSource>(comparer); 
    foreach (TSource item in source) 
    { 
        if (seenElements.Add(item)) 
        { 
            yield return item; 
        } 
    } 
}

https://codeblog.jonskeet.uk/2010/12/30/reimplementing-linq-to-objects-part-14-distinct/ https://codeblog.jonskeet.uk/2010/12/30/reimplementing-linq-to-objects-part-14-distinct/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从列表中删除重复值的最佳算法 的相关文章

随机推荐

  • C 中的可变长度数组并就地初始化[重复]

    这个问题在这里已经有答案了 C99 允许定义具有非常量大小的数组 即用于定义数组的大小可以在运行时更改 解释它的代码片段是 void dummy function1 unsigned int length char arrA length
  • 什么是沼泽图?

    有人告诉我沼泽图 解释说它们可以通过测量给定产品的传入缺陷率和传出修复率来预测代码质量 不幸的是 我无法找到有关这些图表的更多信息 我想知道这是否是特定于一家公司的术语 你能解释一下什么是沼泽图吗 您可以在这篇关于 CESR 的调试和性能特
  • 在Python中获取不带扩展名的文件名

    如果我有一个类似于以下之一的文件名 1 1 1 1 1 jpg 1 1 jpg 1 jpg 我怎样才能只获取文件名 而不获取扩展名 正则表达式合适吗 在大多数情况下 您不应该为此使用正则表达式 os path splitext filena
  • 如何在异步管道上使用自定义管道?

    我正在尝试在异步管道上创建自定义管道 我尝试了很多解决方案 但仍然不起作用 这是代码片段 Product sort ts 自定义管道 import PipeTransform Pipe from angular core import Ob
  • Angular 4 属性在构建时的对象类型上不存在

    我正在使用 Angular 构建一个项目 我使用 angular cli 启动了该项目 当我尝试运行时ng build prod我不断收到此错误 对象类型上不存在属性 描述 生成此错误的代码如下 export class AppCompon
  • 基于 Spring Java 的静态方法配置

    任何人都可以请建议为什么我们需要使用 a 来声明 PropertySourcesPlaceholderConfigurer beanstatic方法 我刚刚发现 如果我在下面使用非静态 那么 url 将被设置为空值 而不是从属性文件中获取
  • 使用 JavaScript 对象文字表示法的 JavaScript 构造函数

    使用对象字面量表示法在 JavaScript 中构建构造函数的最佳方法是什么 var myObject funca function funcb function 我希望能够打电话 var myVar new myObject 并将参数传递
  • 使用 JavaScript 关闭 Youtube 注释

    目前我知道有三种方法可以禁用 YouTube 视频中的注释 您可以使用 YouTube 设置 这对我不起作用 因为我没有 也不想要 帐户 您可以使用专门的扩展 这可能有用 但我不想为此而拥有一个带有大量选项的成熟扩展 您可以使用 广告 拦截
  • PHPUnit ReflectionException 方法套件不存在

    我正在使用 PHPUnit 版本 3 6 2 并且总是得到 PHP ReflectionException 第 113 行 pathTo pear PHPUnit Runner BaseTestRunner php 中不存在方法套件 运行单
  • 如何通过eclipse连接mysql数据库

    我有一个在 eclipse kepler 中运行的应用程序 我的数据库位于AWS RDS MySQL类型上 我已经导入 mysql connector java gpl 5 1 31 msi 和 aws java sdk 1 8 5 jar
  • 无法使用 WiX 安装程序创建注册表项值

    以下组件按预期执行所有操作 但无法写入最后一个注册表项值 我没有收到任何错误
  • 无法找到哈希字符串“android-P”的目标

    我正在跟进this https codelabs developers google com codelabs mdc 101 java 1教程页面 我得到了与他们在该页面中所说的完全相同的错误 无法在以下位置找到哈希字符串 android
  • 使用 Twitter API 可以追溯到多久以前

    我用 C 开发了一个应用程序 可以将推文提取到数据库中 我目前正在使用 TweetSharp Wrapper 由于最近宣布 Twitter 现在已经对之前的所有推文建立了索引 这使您可以返回到最初的推文 因此我开始怀疑是否有可能返回到某个时
  • RMarkdown 文档中的条件格式表

    例如 我可能想使用以下规则为单元格着色 编辑为不平凡 如果 gt 4 则呈蓝色 如果 3 5 则不填充 如果 gt 3 且 如果 使用 RMarkdown knit 创建具有条件格式的表格 https stackoverflow com q
  • Django:如何允许可疑文件操作/复制文件

    我想做一个SuspiciousFileOperationdjango 默认是不允许的 我正在编写一个命令 通过运行manage py importfiles 在我自己编写的 Django 文件存储中导入真实文件系统上给定的目录结构 我想 这
  • 如何让 js-mode 正确缩进连续(复合?)var 声明?

    如果我使用不同的var类似的陈述 function stretchDiv var wh window height var sz2 wh paddingTop paddingBottom mainTop 2 2 the scrollbar
  • 为什么这里断言失败

    为什么当我创建一个时断言在这里失败CvMat 我使用指针加载到 cv Mat 中的图像不会发生这种情况 struct RGB unsigned char b g r cv Point p RGB data CvMat mat cvCreat
  • iOS 14 上的 Arkit/SceneKit 抛出新警告(金属)

    自从升级到 iOS14 以来 每当我向场景添加基本节点时 我都会收到金属警告 我不使用任何阴影 只使用标准材质 2020 09 24 18 51 04 548764 0100 Arvie AR 383 7987 Metal Compiler
  • C++:在 switch 语句内构造数组

    我正在尝试构建一个具有几种不同配置的数组 其中将随机选择一个配置 我首先尝试的代码是 void createArray int tileVals int randInt rand 3 switch randInt case 0 int ti
  • 从列表中删除重复值的最佳算法

    从列表中删除重复值的最佳算法是什么 我试过这个 for int i 0 i lt AuthorCounter 1 i for int j 0 j lt AuthorCounter 1 j if i j if AuthorGroupNode