Я видел различные вопросы, связанные с ошибкой Timsort здесь, и применил изменение кода на основе этого. Но ни один из них не дает мне результата. Пожалуйста, помогите мне в разрешении моей ошибки. Код:Метод сравнения нарушает его общий контракт - ошибка TimSort.mergeLo
public int compare(Record record1, Record record2) {
int indexOfRecord1=records.indexOf(record1);
int indexOfRecord2=records.indexOf(record2);
Integer sortIndexOfRecord1=indexToSortIndexMap.get(indexOfRecord1);
Integer sortIndexOfRecord2=indexToSortIndexMap.get(indexOfRecord2);
//Option 1: Throws same Timsort error:
if(sortIndexOfRecord1!=null && sortIndexOfRecord2!=null){
return sortIndexOfRecord1.compareTo(sortIndexOfRecord2);
}else{
return (sortIndexOfRecord1==null && sortIndexOfRecord2==null)?0:(sortIndexOfRecord1==null)?-1:1;
}
//Reframed the above logic like below. I got the same error
//Option 2: Throws same Timsort error:
/*
if(sortIndexOfRecord1!=null && sortIndexOfRecord2!=null){
if(sortIndexOfRecord1.intValue() == sortIndexOfRecord2.intValue())
return 0;
else if(sortIndexOfRecord1.intValue() < sortIndexOfRecord2.intValue())
return -1;
else if(sortIndexOfRecord1.intValue() > sortIndexOfRecord2.intValue())
return 1;
}else if(sortIndexOfRecord1==null && sortIndexOfRecord2==null){
return 0;
}else if(sortIndexOfRecord1==null && sortIndexOfRecord2!=null){
return -1;
}else if(sortIndexOfRecord1!=null && sortIndexOfRecord2==null){
return 1;
}
return 0;
*/
//Option 3: Throws same Timsort error:
/*
int index1 = -1;
int index2 = -1;
if(record1 != null && record2 != null){
index1 = indexToSortIndexMap.get(indexOfRecord1)!=null?indexToSortIndexMap.get(indexOfRecord1):-1 ;
index2 = indexToSortIndexMap.get(indexOfRecord2)!=null?indexToSortIndexMap.get(indexOfRecord2):-1 ;
}else if(record1 != null && record2 == null){
index1 = indexToSortIndexMap.get(indexOfRecord1)!=null?indexToSortIndexMap.get(indexOfRecord1):-1 ;
}else if(record1 == null && record2 != null){
index2 = indexToSortIndexMap.get(indexOfRecord2)!=null?indexToSortIndexMap.get(indexOfRecord2):-1 ;
}else{
index1 = -1;
index2 = -1;
}
if (index1 > index2){
return +1;
}else if (index1 < index2){
return -1;
}else{
return 0;
}
*/
Все вышеизложенное дает ошибку ниже:
Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(Unknown Source)
at java.util.TimSort.mergeAt(Unknown Source)
at java.util.TimSort.mergeCollapse(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
Я также попробовал другие варианты. Это тоже дает ту же ошибку. 'code' – Ismail
Huh. Это странно. Существует ли какая-либо возможность одновременного изменения «записей» или «indexToSortIndexMap»? –
@LouisWasserman Nope.It не был одновременно изменен. Я обновил код со всеми возможными параметрами. – Ismail