2011-05-18 60 views
0

我在我的arraylist中有重复项,并希望删除这些重复项以使其不同。我尝试使用hastable来摆脱重复,但它毁了命令。如何在不更改广告订单的情况下将其分开?使arraylist不同

+0

我们正在谈论的集合有多大? – 2011-05-18 17:58:57

+4

@Sebastian,这个问题是Java。 – 2011-05-18 17:59:56

回答

4

如何:

using System.Linq; 

myArrayList = new ArrayList(myArrayList.Distinct().ToArray()); 

var myArray = myArrayList.Distinct().ToArray(); 
+2

'ArrayList'不需要'IEnumerable '。您需要在'Distinct()'之后添加'ToArray()'。也就是说,一个'List '比'ArrayList'更可取,尽管这是OP的当前集合。 – 2011-05-18 18:06:59

+0

我通常不会使用ArrayLists,我使用的集合通常会收到以及IEnumberable 到它们的构造函数。如果是这种情况,你想要一个ArrayList而不是一个数组(如我的第二个例子),那么你可能需要逐一复制这些值(除非它有一个.AddRange()方法)。 – 2011-05-18 18:15:00

+2

感谢那些信息,但是你不能在arralist上使用Distinct()。我不得不将我的数组列表转换为数组,然后使用distinct,然后将其转换回数组列表。虽然我能够在你的帮助下到达那里。谢谢! – m0g 2011-05-18 18:58:28

0

哈希表确实听起来是个不错的主意。

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))。

+0

如果他们是重复的,第一个或最后一个实例将无关 – 2011-05-18 18:04:19

+0

@Angelo,我想我不太了解您的意见... 显然,如果有重复的重复实例是不相关的,但你需要找到它以便将其删除... – TCS 2011-05-18 18:11:46

0

塞巴斯蒂安是对的。从技术上讲,如果您试图避免重复,请使用不支持重复的集合。使用一个Hashtable,循环访问你的ArrayList并将它们弹出。如果所有的代码都是你的,看看你是否可以重构,以便你不使用ArrayList