JAVA_Runtime_Error :- Comparison method violates its general contract

JAVA_Runtime_Error :- Comparison method violates its general contract

我尝试对 nodes.I 的数组列表进行排序时出现此错误我已经尝试了大部分解决方案,但其中 none 对我的情况有效。

java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.ComparableTimSort.mergeHi(ComparableTimSort.java:866)
at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:483)
at java.util.ComparableTimSort.mergeCollapse(ComparableTimSort.java:406)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:213)
at java.util.Arrays.sort(Arrays.java:1312)
at java.util.Arrays.sort(Arrays.java:1506)
at java.util.ArrayList.sort(ArrayList.java:1454)
at j...

代码是

static class Node implements Comparable<Node>
{
    int key;
    int value;
    int double_value;

    public Node(int key , int value , int double_value)
    {
        this.key = key;
        this.value = value;
        this.double_value = double_value;
    }

    public int compareTo(Node node)
    {
        if(double_value < node.double_value)
            return 1;
        else if(double_value > node.double_value)
            return -1;

        return -1;
    }
}

它适用于小输入,但当输入数量很大时会出现此错误。我也读过比较方法中的传递性规则,但我无法弄清楚它在这种情况下是如何应用的。

提前致谢。

因为你实际上是在比较 int 值(尽管它被命名为 double_value)你可以有一个非常简单的 compareTo 方法

public int compareTo(Node node)
{
    return this.double_value - node.double_value;
}

您不必 return -1、0 或 +1 — 任何负值或正值都可以。
compareTo() 的文档说:

Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.

所以

Node node1 = new Node(5, 5, 5);
Node node2 = new Node(7, 7, 7);
System.out.println( node1.compareTo(node2) );

将产生 -2,因为 5 小于 7。

当您覆盖 compareTo 时,您也应该覆盖 .equals(Node other),而当您覆盖 equals 时,您应该 also override hashCode().


根据 Chris Parker 的评论更新以提高安全性,这可以追溯到使用 -1、0、1 作为结果:

public int compareTo(Node other)
{
    final long m = (long) this.double_value = (long) other.double_value;
    return m < 0 ? -1 :
           m > 0 ?  1 :
           0;
}