2011-05-18 23 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