2012-07-01 49 views
6

我的問題是:什麼是快速確定數字是否包含在Collection中以知道是否將其添加到集合並保持唯一性。如果我可以幫忙,我寧願不重複列表。存儲唯一整數的好方法

我有一個List<Integer>numberList。我希望它存儲唯一的整數,並且不允許添加重複項。我願做這樣的事情:

private void add(int number) { 
    if (!numberList.contains(number)) { 
    numberList.add(number); 
    } 
} 

但顯然這不會工作,因爲numberList包含Integer對象的列表,無論數量的每一個都是唯一的對象。

謝謝!

+0

我認爲'contains(...)'方法使用對象的equals(...)'方法來查看它是否被集合持有,所以上面的方法也應該防止重複。 –

+0

呵呵,也許別的東西是錯誤的,我的代碼會產生意想不到的結果。謝謝你的提示! – kentcdodds

+1

如果你的代碼和我的一樣,那麼總是有*別的錯誤!如果您需要尋找幫助,請回復更多信息! –

回答

12

一種是將整數存儲在Set<Integer>中,例如。套件不允許重複。

編輯
此外,收藏的contains(...)方法使用對象的equals(...)方法,看它是否被收集或持有沒有,所以你的上述方法將防止重複爲好,如果你需要使用列表作爲您的收藏。自己測試一下,你會發現它是如此。

例如:

List<Integer> numberList = new ArrayList<Integer>(); 
    int[] myInts = {1, 1, 2, 3, 3, 3, 3, 4}; 
    for (int i : myInts) { 
    if (!numberList.contains(i)) { 
     numberList.add(i); 
     } 
    } 

    System.out.println(numberList); 

將返回:[1, 2, 3, 4]

而且,與HashSets一個可能的問題是他們沒有命令,因此,如果順序很重要,你要看看使用其他種類的有序集合之一。

+0

出於好奇,你認爲哪種實現會更快?在添加之前讓'Set'處理重複項還是使用List中的'contains'會更快嗎? – kentcdodds

+0

@kentcdodds:我相信哈希集會更快,因爲哈希是一個非常快速的操作,但我不能100%的保證說,因爲我從來沒有研究算法的大O.但是,徘徊,其中一位計算機科學家將很快回答這個問題,毫無疑問。 –

+0

感謝您的提示! – kentcdodds

3

不是最簡潔的形式是BitSet?它在存儲方面效率很高,因爲它會無限擴展。它也不會不必要地使用存儲。

你在多線程環境中工作嗎?如果有的話,還有其他的結構可能會更好/更有效率。

+0

你讓我了!這是一個多線程環境,這就是我爲什麼這樣做的原因。我想檢查一個線程是否已經添加了該號碼。 – kentcdodds

+0

在這種情況下,您幾乎可以肯定地尋找'ConcurrentHashMap',可能包裝在使用[newSetFromMap]派生的集合中(http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html #newSetFromMap%28java.util.Map%29),但如果你喜歡,你總是可以將'Boolean.TRUE'添加到'Map'。 – OldCurmudgeon

+1

BitSet對於小而密集的數字非常有效。但是'新的BitSet().add(Integer.MAXVALUE);'已經分配了268MB。所以應該小心使用它。 – Arne

相關問題