首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较法违反其一般契约-- TimSort.mergeLo错误

比较法违反其一般契约-- TimSort.mergeLo错误
EN

Stack Overflow用户
提问于 2016-11-04 06:01:10
回答 1查看 230关注 0票数 0

我在这里看到了与Timsort错误相关的各种问题,并在此基础上应用了代码更改。但它们都没有给我带来结果。请帮助我解决我的错误。代码:

代码语言:javascript
复制
    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;
    }
    */

以上所有情况都会产生以下错误:

代码语言:javascript
复制
    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)
EN

回答 1

Stack Overflow用户

发布于 2016-11-04 08:40:16

这三个选项似乎都很好。但是,您可以尝试将它们替换为标准比较器,以确保:

代码语言:javascript
复制
return Comparator.nullsFirst(Integer::compare)
                 .compare(sortIndexOfRecord1, sortIndexOfRecord2);

一种可能的答案是,您实际上是在对用于获取记录索引的records列表进行排序。这真是个坏主意。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40411981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档