我在嘗試對節點的數組列表進行排序時出現此錯誤。我嘗試了大多數解決方案,但是沒有一個適用於我的情況。JAVA_Runtime_Error: - 比較方法違反了其總體合同
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;
}
}
它適用於小的投入,但是當輸入的數量是很大它給這個錯誤。我也在比較方法中閱讀了傳遞性規則,但我無法弄清楚在這種情況下它是如何應用的。
在此先感謝。
返回-1,如果兩個節點具有相同的值,這意味着根據您比較的順序,節點可以同時小於並大於其他節點。這實際上違反了「Comparable.compareTo」的合同(就此而言常識也被違反)。對於比較雙倍的簡單情況,請改爲使用'Double.compare'方法。 –
你的'compareTo'永遠不會返回'0'來表明它們是相同的,你也應該重寫'equals()',這樣兩個節點持有相同的double_value'n1.equals(n2)'返回true。當你重寫equals時,你應該重寫'hashcode()' –
請不要下劃線!遵循Java命名約定並用'doubleValue'替換'double_value'。 –