list - 如何从列表中删除所有重复项?

标签 list delphi unique delphi-xe7 spring4d

考虑这个测试应用程序:

function RemoveDuplicates(const Input: IEnumerable<Integer>): IEnumerable<Integer>;
begin
  // How to implement this function?
end;

var
  Enumerable: IEnumerable<Integer>;
  UniqueEnumerable: IEnumerable<Integer>;
begin
  Enumerable := TCollections.CreateList<Integer>([1, 1, 2, 3, 3, 3, 4]);
  UniqueEnumerable := RemoveDuplicates(Enumerable);
  UniqueEnumerable.ForEach(
    procedure(const I: Integer)
    begin
      WriteLn(I);
    end);
  ReadLn;
end.

如何实现 RemoveDuplicates 函数(这在 Haskell 中称为 nub)?

最佳答案

使用已有的内容:

uses
  Spring.Collections,
  Spring.collections.Extensions;

function RemoveDuplicates(const Input: IEnumerable<Integer>): IEnumerable<Integer>;
begin
  Result := TDistinctIterator<Integer>.Create(Input, nil);
end;

这支持延迟计算(意味着在处理结果可枚举之前不处理输入)。它在内部使用哈希集(当前实现为字典)来跟踪已找到的项目(这发生在枚举器内部)。

为什么这很重要?因为如果 Input 涉及其他昂贵的操作,则任何执行完整枚举的操作都可能会导致不必要的性能影响,而这些操作可能远远超过其他删除重复项的方法(例如将其放入列表并对其进行排序)的任何好处。此外,IEnumerable 不保证是有限的。

如果在调用此函数和枚举结果之间,Input 发生了更改,则该更改会影响枚举的结果,但如果您不支持延迟计算,则情况并非如此。如果您枚举多次,每次结果可能会有所不同(即最新的)。

关于list - 如何从列表中删除所有重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32375074/

相关文章:

python - 从 df 列连接列表

matlab - 删除相邻的重复项

C++ 列表拼接帮助

c# - List<T> 并发删除和添加

delphi - 带有 Delphi VCL 样式的平面工具栏按钮——用下拉菜单修复工具栏项目?

delphi - 具有 {$R *.DFM} 指令的接口(interface)和实现部分的差异

java - 独特元素的数组?

PHP 随机 URL 名称(短 URL)

python - 使用相同的索引并行遍历 2 个列表

delphi - 迭代 IHTMLElementCollection