2014-06-26 57 views
0

我嘗試過使用Guava中的Sets.intersection方法()來比較字符串類型的集合。它工作正常。我想知道我應該使用什麼方法來比較兩個對象?我已經重寫了compareTo()方法,但Sets.intersection將相似的對象視爲不同的對象。你能建議嗎?我們可以重寫番石榴的交集方法來比較對象嗎?

謝謝。

回答

2

你一定要讀的Set定義:

更正式地說,集包含沒有對元素E1和E2,使得e1.equals(E2),並且最多一個空元素。

實施hashCode()equals()

4

鑑於Sets.intersection()實現:

public static <E> SetView<E> intersection(final Set<E> set1, final Set<?> set2) { 
    //... 
    return new SetView<E>() { 
     //... 
     @Override public boolean contains(Object object) { 
     return set1.contains(object) && set2.contains(object); 
     } 
     @Override public boolean containsAll(Collection<?> collection) { 
     return set1.containsAll(collection) 
      && set2.containsAll(collection); 
     } 
    }; 
    } 

我說你必須執行需要什麼方法,使併爲Set小號containsAll()工作,你傳遞,因爲所有的工作都委託給您在通過Set秒。

所以對於HashSet s表示將equals()hashCode(),併爲TreeSet s表示將compareTo()如果實現Comparablecompare()如果您使用Comparator(可能還想覆蓋equals()hashCode()以使事物在Map之外保持一致)。

+0

'compareTo()'/'compare()'應該是'TreeSet'用來確定相等的所有東西。也就是說,'compareTo()'_should_(但並非嚴格要求)與'equals'一致,如果兩個元素比較爲'0',它們應該總是等於'equals()'。這意味着也正確執行'hashCode()'。 – ColinD

+0

@ColinD更新了我的答案,將其考慮在內。謝謝! – awksp