【发布时间】:2011-05-18 17:55:37
【问题描述】:
我的数组列表中有重复项,并希望删除这些重复项以使其与众不同。我尝试使用 hastable 摆脱重复,但它破坏了订单。如何在不更改插入顺序的情况下使其与众不同?
【问题讨论】:
-
我们所说的收藏有多大?
-
@Sebastian,这个问题是 Java。
我的数组列表中有重复项,并希望删除这些重复项以使其与众不同。我尝试使用 hastable 摆脱重复,但它破坏了订单。如何在不更改插入顺序的情况下使其与众不同?
【问题讨论】:
怎么样:
using System.Linq;
myArrayList = new ArrayList(myArrayList.Distinct().ToArray());
或
var myArray = myArrayList.Distinct().ToArray();
【讨论】:
ArrayList 不接受IEnumerable<T>。您需要在Distinct() 之后添加ToArray()。也就是说,List<T> 比 ArrayList 更可取,尽管这是 OP 的当前集合。
Hashtable 听起来确实是个好主意。
foreach object in the ArrayList:
if (object in hashtable)
{
remove object from ArrayList. (instead of object you can use object's hash)
// (notice, the ArrayList's indexes will change after you remove!)
}
else
{
insert object to Hashtable. (instead of object you can use object's hash)
}
运行后,您将只有每个对象的第一个实例。
请注意,您不必使用 HashTable,即使是另一个 ArrayList 也足够了。尽管如此,我还是会使用 hashtable,因为在平均情况下,hashtable 中的搜索/插入是 O(1),而 arraylist 中的二进制搜索是 O(log(n))。
【讨论】:
塞巴斯蒂安是对的。从技术上讲,如果您想避免重复,请使用不支持重复的集合。使用 Hashtable,遍历 ArrayList 并将它们弹出到其中。如果所有代码都是你的,看看你是否可以重构,以便你不使用 ArrayList
【讨论】: