2016-05-29 63 views
0

如何知道什麼已被消除HashSet?Java - 如何知道已經被淘汰的HashSet?

我有一個數組int [] x = {2, 4, 4, 5};

當我隱蔽它,HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(x));

我怎麼知道哪些元素已經從x排除到set

+0

沒有辦法說第一個或第二個'4'被淘汰,因爲它們是平等的。 –

+0

沒有老兄,在這種情況下,我只想「4」@PeterLawrey –

+0

在這種情況下,你應該檢查你添加他們看Jon Skeet的答案。注意:如果有三個4例如,你可以得到重複,重複。 –

回答

5

而不是使用該構造方法,你可以使用:

Set<Integer> set = new HashSet<>(); 
for (int value : x) { 
    if (!set.add(value)) { 
     // Or whatever you want to do 
     System.out.println("Detected a duplicate... " + value); 
    } 
} 
+0

好吧,所以'set.add'返回布爾值? –

+0

是的,如果成功則返回'true',否則返回'false'。 –

+3

@TilakMadichetti:你看過要檢查的文檔,並理解返回值嗎? (堆棧溢出是*不是*自己閱讀文檔的替代品。) –

1

除了什麼喬恩斯基特提到的,如果你正在尋找的東西通用的,那麼這裏有我的可能的方法:

  1. 查找數組中的重複項,以及那些可以被視爲從HashSet中移除的值。儘管如此,這並不需要對HashSet做任何事情。

實施例:

Arrays.sort(myArray); 
for (int i = 1; i < myArray.length; ++i) { 
    if (0 == myComparator.compare(myArray[i - 1], myArray[i])) { 
    // Found a duplicate. Store/print it 
    } 
} 
  • 擴展HashSet類並覆蓋add(Object obj)方法,使得當對象在HashSet中已經存在它被添加到列表已刪除的項目。當然,這意味着你將不得不使用這個定製HashSet無論你想使用HashSet
  • 例子:

    public MyHashSet extends HashSet<E> { 
    List<E> removedAsDuplicateItems = new ArrayList<>(); 
    
    @Override 
    public boolean add(E e) { 
        boolean isNewItem = map.put(e, PRESENT)==null; 
        if(!isNewItem) removedAsDuplicateItems.add(e); 
        return isNewItek; 
    } 
    
    public List<E> removedAsDuplicateItems() { 
        return removedAsDuplicateItems; 
    } 
    } 
    

    我希望有更多的,我不知道的優雅和簡潔的解決方案。