я получил исключениепочему Компаратор <Integer[]> выбрасывает исключение?
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:868)
at java.util.TimSort.mergeAt(TimSort.java:485)
at java.util.TimSort.mergeCollapse(TimSort.java:408)
at java.util.TimSort.sort(TimSort.java:214)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at Main.main(Main.java:64)
при использовании этого кода:
Arrays.sort(arr, new Comparator<Integer[]>(){ //arr is 2D array
public int compare(Integer[] o1, Integer[] o2){
return o1[2]==o2[2]?0:o1[2]>o2[2]?1:-1;
}
});
, который я считаю, связан с не удовлетворяющей транзитивностью сравнения, но когда я сделал небольшое изменение, как это:
Arrays.sort(arr, new Comparator<Integer[]>(){ //arr is 2D array
public int compare(Integer[] o1, Integer[] o2){
return o1[2].compareTo(o2[2]); // here is the change
}
});
исключение больше не сгенерировано. я не могу понять объяснение этого вопроса, как я уверен, что экземпляр Integer можно сравнить с использованием реляционных операторов (>, < =) кроме того CompareTo() метод
Integer x = 1;
Integer y = 2;
System.out.println(x<y);
печатает правда, как и ожидалось
Может ли любое тело прояснить?
http://stackoverflow.com/questions/8327514/comparison-method-violates-its-general-contract –
«Целочисленные» экземпляры * не сравниваются * с использованием реляционных операторов. Сначала подразумевается неявное распаковка. –
Каково содержимое ваших массивов? Существуют ли какие-либо значения вне [Целочисленный диапазон кеша] (https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#valueOf-int-)? – rgettman