gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:55:52 26 4
gpt4 key购买 nike

考虑这个测试应用程序:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com