“比较方法违反了其一般合同” - 即使正确实施比较器也是如此

时间:2013-11-19 10:37:11

标签: comparator

我对collection.sort()方法有些问题。

  

java.lang.IllegalArgumentException:比较方法违反了其一般合同!

     

at java.util.TimSort.mergeLo(TimSort.java:747)

     

at java.util.TimSort.mergeAt(TimSort.java:483)

     

at java.util.TimSort.mergeCollapse(TimSort.java:410)

     

at java.util.TimSort.sort(TimSort.java:214)

     

at java.util.TimSort.sort(TimSort.java:173)

     

在java.util.Arrays.sort(Arrays.java:659)

     

在java.util.Collections.sort(Collections.java:217)

这是我的比较器

public int compare(Key key1, Key key2)
{

    if (key1.Score > key2.Score)
        return -1;

    else if(key1.Score < key2.Score)

        return 1;

    else

        return 0;
}

我目前是jdk 1.7,我也试过1.6,但它没有用。我无法理解它是排序方法还是其他问题的问题。(我试图对包含1000多个项目的列表进行排序,但它没有任何NaN)。

1 个答案:

答案 0 :(得分:1)

违反比较方法的一般合同意味着它不提供一致或正确的答案。似乎这种方法在多次比较相同的对象时不会返回相同的结果。

此代码可作为独立版本使用。你有其他一些线程修改集合项吗?