2012-03-18 39 views
0

我知道,如果一個覆蓋equals,那麼hashCode也應該被覆蓋。是否有任何類似的規則適用於重寫compareTo?重寫compareTo有什麼含義?

這是一個Java問題。

+0

不久發佈的鏈接之後,我決定不偷懶,實際上覆制/粘貼到一個答案:) – Corbin 2012-03-18 08:51:03

回答

3

它的期望可以在這裏閱讀:http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

這將是您最感興趣的部分大概是:

強烈推薦(雖然不是必須的)天然 排序與平等一致。這是因爲排序集 (和排序的地圖)沒有明確的比較行爲「奇怪」,當 它們與自然排序是 與等號不一致的元素(或鍵)使用。特別是,這樣的排序集合(或排序後的映射)違反了集合(或映射)的一般合同,該集合根據等號方法定義爲 。

0

它在解釋JavaDocs

一類C的自然順序被說成是符合等於當且僅當e1.compareTo(e2) == 0對每一個e1相同的布爾值e1.equals(e2)e2的類別C

請注意,它不是要求,即如果兩個類別根據compareTo()相等,則它們不必保持equals()。這很好,因爲您可以按年齡對人進行排序,因此,兩個年齡相同的人在Comparator<Person>方面被認爲是相同的,但他們顯然不必相同。

但是,在這種特殊情況下,如果年齡相等(如果排序總是穩定並且可以在相同年齡段的人中進行預測),那麼您可能需要爲比較器添加輔助屬性,因此畢竟包含compareTo()中的相同屬性可能是一個好主意在某些情況下。

+0

這是一個很好的點似乎適用於我的情況。我測量對象的效用並對效用進行排序。 (就像效用的經濟定義一樣)。但是這些對象並不相同。巧合的應用可能是一樣的。 – H2ONaCl 2012-03-18 09:07:28

+0

如果compareTo僅用於排序,除了速度效果之外,在向比較添加字段方面沒有任何損害。通過這種方式,可以使compareTo與equals相一致。 – H2ONaCl 2012-03-18 16:29:51

0

Comparator的文檔有謹慎注意:

由比較器C上的一組元素S中的排序被認爲是與等號當且僅當c.compare(E1,E2一致)== 0具有相同的布爾值作爲e1.equals(E2),用於在每S. e1和e2

應謹慎使用能夠施加的排序不一致與equals訂購有序集合的比較器時行使(或有序地圖)。假設使用顯式比較器c的排序集合(或排序映射)與從集合S中繪製的元素(或鍵)一起使用。如果由S對c施加的排序與equals不一致,則排序集合(或排序映射)將表現「奇怪」。特別是,排序後的集合(或排序後的映射)將違反集合(或映射)的一般合約,集合(或映射)以等式定義。

0

我想告訴你,你應該在對象中有一個特定的屬性或屬性,你將用它來比較兩個相同類型的對象。