2009-04-27 18 views
7

我想在SortedSet | SortedMapequals和compareTo是否有意義不一致?

class MyClass implements Comparable<MyClass>{ 
    // the only thing relevant to comparisons: 
    private final String name; 

    //... 
} 

類的實例必須按其name屬性進行排序。
但是,我不希望同樣命名的實例被認爲是平等的。

因此,SortedSet的內容看起來像a,a,a,b,c
(通常情況下,SortedSet只允許A,B,C

首先:是這樣的(哲學)是否一致?

如果是這樣,我必須想到不可預知的行爲,當我不 覆蓋equals(...)hashCode()

編輯:
我很抱歉,我的問題似乎不一致:
我想把多個「平等」的價值觀一個內設置,不允許這種 的概念。
所以,請不要回復我的問題了。
感謝所有已經回覆的人。

+0

爲什麼不只是使用不同的集合類型? – 2009-04-28 02:02:38

+0

是的,google-collection-API的MultiSet | MultiMap對此似乎很好。 我非常希望Sun,aehm和Oracle人們有一天會爲Java收集API添加功能... – 2009-04-28 07:09:37

回答

18

讓我問你一個問題:請問a.compareTo(b)返回0,a.equals(b)返回false是否合理?

我會用Comparator<MyClass>來代替。這就是爲什麼我所知道的所有SortedMap/SortedSet實現允許您在創建時通過Comparator

+0

我傾向於回答:它沒有意義;) 謝謝,我忘記了有這樣的事情一個比較器;) – 2009-04-27 19:39:11

2

Effective Java建議,如果你不執行compareTo符合equals你應該清楚地表明這樣:

推薦的語言是「注意:此 類有一個自然排序 與equals不一致。 「

0

只是把這個代碼的equals方法和不要以後再想想:

public boolean equals(Object obj) { 
    if (this == obj) return true; 
    if (!(obj instanceof MyClass)) return false; 
    return 0 == this.compareTo((MyClass) obj); 
} 
4

從Javadoc文檔可比

強烈推薦(雖然不是 要求)自然順序是 與等號一致。這是如此 因爲排序集合(和有序映射) 沒有顯式比較的行爲 「奇怪」當他們與 元素(或鍵),其天然 順序是不符合等於

使用。如果你想要compareTo與equals()不一致,建議您通過提供實現Comparator的類來使用顯式比較器。

如果是這樣,當我不覆蓋equals(...)和hashcode()時,是否必須期待不可預知的行爲?

你應該仍然覆蓋equals()和hashcode()。 equals()和hashcode()是否與compareTo一致是另一回事。

相關問題