我在这里看到了与Timsort错误相关的各种问题,并在此基础上应用了代码更改。但它们都没有给我带来结果。请帮助我解决我的错误。代码:
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)发布于 2016-11-04 08:40:16
这三个选项似乎都很好。但是,您可以尝试将它们替换为标准比较器,以确保:
return Comparator.nullsFirst(Integer::compare)
.compare(sortIndexOfRecord1, sortIndexOfRecord2);一种可能的答案是,您实际上是在对用于获取记录索引的records列表进行排序。这真是个坏主意。
https://stackoverflow.com/questions/40411981
复制相似问题