Я получаю эту ошибку, когда пытаюсь отсортировать массив узлов. Я пробовал большинство решений, но ни одно из них не сработало в моем случае.
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;
}
}
Это работает для небольших входов, но когда количество входов велико, выдает эту ошибку. Я также читал о правиле транзитивности в методе сравнения, но я не могу понять, как оно применяется в этом случае.
Заранее спасибо.
Comparable.compareTo
(и здравый смысл тоже нарушается, если уж на то пошло). Для простого случая сравнения двойников лучше использовать методDouble.compare
. - person M. Prokhorov   schedule 23.05.2017compareTo
никогда не возвращает0
, чтобы указать, что они одинаковы, и вы также должны переопределитьequals()
, чтобы два узла, содержащие одно и то же значение double_valuen1.equals(n2)
, возвращали true. Когда вы переопределяете равенство, вы также должны переопределятьhashcode()
- person Stephen P   schedule 23.05.2017double_value
наdoubleValue
. - person MC Emperor   schedule 23.05.2017