Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java7-比较方法违反了它的一般约定(TimSort.java)_Java_Sorting_Java 7 - Fatal编程技术网

Java7-比较方法违反了它的一般约定(TimSort.java)

Java7-比较方法违反了它的一般约定(TimSort.java),java,sorting,java-7,Java,Sorting,Java 7,这是我得到的堆栈跟踪 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.merg

这是我得到的堆栈跟踪

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;
}
public int compare(字段pObject1,字段pObject2)
{
int比较=0;
//...
如果(比较==0)
{
如果(pObject1.hashCode()B和B>C,那么对于任何A、B和C:A>C。

我正试图想出一个反例,但我在这里失败了,感谢您的帮助!

您的函数永远不能返回0!这意味着如果对象中的所有内容都相等,包括hashcodes,那么
pObject1.compare(pObject2)
将不等于
pObject2.compare(pObject1)
。比较函数必须是对称的。我还认为您在该测试中交换了
-1
1
,因此您最后的检查应该是:

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

return compare;
if(比较==0){
if(pObject1.hashCode()pObject2.hashCode()){
比较=-1;
}
}
返回比较;
顺便说一下,您的对象应该实现
Comparable
接口,并且该方法应该被称为
compareTo


最后,比较hashCode不是一个好主意。即使对象不相等,它们也可能发生冲突。这意味着当对象不相等时,
compareTo
方法可以返回
0
。这也违反了
compareTo
契约。

if(pObject1.hashCode())你能告诉我们完整的比较方法吗?这是Java 7特有的吗?错误是从切换到Java8开始的,因为排序的更改是由Java7带来的。谢谢,我怀疑代码中有这一部分。我想我应该使用这个返回整数。比较(pObject1.hashCode(),pObject2.hashCode())就像下一个答案提到的那样。或者在这一点上返回0,因为使用hashCode似乎是一种不好的做法。是的,我宁愿只返回0。
if (pObject1.hashCode() <= pObject2.hashCode())
{
   compare = -1;
} else {
   compare =  1;
}