2017-07-18 72 views
0

這裏是堆棧跟蹤我得到Java7 - 比較法違反其總承包(TimSort.java)

Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract! 
     at java.util.TimSort.mergeLo(TimSort.java:777) 
     at java.util.TimSort.mergeAt(TimSort.java:514) 
     at java.util.TimSort.mergeCollapse(TimSort.java:441) 
     at java.util.TimSort.sort(TimSort.java:245) 
     at java.util.Arrays.sort(Arrays.java:1512) 
     at java.util.ArrayList.sort(ArrayList.java:1454) 
     at java.util.Collections.sort(Collections.java:175) 
     at xxx.sortDisplayFields(OfferFieldLayout.java:521) 

這裏是比較方法:

public int compare(Field pObject1, Field pObject2) 
{ 
    int compare = 0;    

    //... 
    if (compare == 0) 
    { 
     if (pObject1.hashCode() <= pObject2.hashCode()) 
     { 
      compare = -1; 
     } 
     else 
     { 
      compare = 1; 
     } 
    } 

    return compare; 
} 

我認爲這是由於傳遞性不受尊重: 傳遞性:如果A> B和B> C,那麼對於任何A,B和C:A> C。 我想要拿出一個反例,但我在這裏失敗了,任何幫助不勝感激!

+0

[Java錯誤:比較方法違反其常規合同]的可能重複(https://stackoverflow.com/questions/11441666/java-錯誤比較方法違反它的一般合同) – Kon

+1

你能告訴我們完整的比較方法嗎? –

+0

這是特定於Java 7的嗎? – shmosel

回答

3

你的函數永遠不能返回0!這意味着如果對象中的所有內容都相等,包括hashcode,那麼pObject1.compare(pObject2)將不等於pObject2.compare(pObject1)。比較函數必須是對稱的。我還以爲你在測試交換周圍-11,所以你最後的檢查應該是這樣的:

if (compare == 0) { 
    if (pObject1.hashCode() < pObject2.hashCode()) { 
     compare = 1; 
    } else if (pObject1.hashCode() > pObject2.hashCode()) { 
     compare = -1; 
    } 
} 

return compare; 

順便說一下,你的對象應該實現Comparable接口,方法應該叫compareTo

最後,比較hashcode並不是一個好主意。即使物體不相同,它們也會發生碰撞。這意味着當對象不相等時,您的compareTo方法可以返回0。這也違反了compareTo合同。

+0

謝謝,我在代碼中懷疑此部分。我想我應該只用這個 返回Integer.compare(pObject1.hashCode(),pObject2.hashCode())就像下一個答案提到的一樣。或者只是返回0在那一點,因爲使用hashCode似乎是一個不好的做法.. – Astro

+0

是的,我寧願只是返回0。 – marstran

1
if (pObject1.hashCode() <= pObject2.hashCode()) 
{ 
    compare = -1; 
} else { 
    compare = 1; 
} 

這部分是肯定不能與compareTo合同兼容,因爲如果哈希碼相等,所述比較是相等。相反,你應該使用return Integer.compare(pObject1.hashCode(), pObject2.hashCode()),假設你想使用散列碼進行比較。 (這通常不是一個好主意,因爲哈希碼可能恰好碰撞。)

相關問題