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;
}
我尝试对 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;
}