2017-07-18 36 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()),假设你想使用散列码进行比较。 (这通常不是一个好主意,因为哈希码可能恰好碰撞。)

相关问题