在对List中的元素进行排序时,添加了比较器,但是在比较的过程中出现如下异常。在网上搜索的博客中是在jdk7以后,如果比较器对比较的元素不具有传递性的话,就会抛出异常,但是我感觉我的代码中并不存在不可传递性啊。最后是我比较器中的代码。java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:864)
at java.util.TimSort.mergeAt(TimSort.java:481)
at java.util.TimSort.mergeForceCollapse(TimSort.java:422)
at java.util.TimSort.sort(TimSort.java:219)
at java.util.TimSort.sort(TimSort.java:169)
at java.util.Arrays.sort(Arrays.java:2038)
at java.util.Collections.sort(Collections.java:1891)
at com.haizhi.oa.chat.model.ChatData.sort(TbsSdkJava:104)
at com.haizhi.oa.chat.ChatListActivity$8.run(TbsSdkJava:358)
我的比较代码如下:public int compare(ChatData lhs, ChatData rhs) {
                if (lhs == null && rhs == null) {
                    return 0;
                }
                if (lhs == null) {
                    return -1;
                }
                if (rhs == null) {
                    return 1;
                }
                //首先判断置顶是否一致,如果一致则判断是否有草稿是否一致,如果一致则判断创建时间
                if (lhs.pinned == rhs.pinned) { //置顶
                    String l = MainPrefences.getChatEdit(lhs.targetId);
                    String r = MainPrefences.getChatEdit(rhs.targetId);
                    //如果都有草稿或都没有草稿,则判断时间
                    if (TextUtils.isEmpty(l) == TextUtils.isEmpty(r)) { //草稿
                        long ll = StringUtils.stringToLong(lhs.createdAt);
                        long rr = StringUtils.stringToLong(rhs.createdAt);
                        if (ll == rr) { //创建时间
                            return 0;
                        } else {
                            return ll < rr ? 1 : -1;
                        }
                    }else { //否则有草稿的地方为小
                        return TextUtils.isEmpty(l) ? 1 : -1;
                    }
                }else {
                    return lhs.pinned ? -1 : 1;
                }
            }

解决方案 »

  1.   

    有没有你List 里元素的例子?
      

  2.   

    return ll < rr ? 1 : -1;小于应该返回 -1, 大于才应该返回 1 
      

  3.   

    而且比较null 是没有任何意义的
      

  4.   


    这个是我们的比较规则,小的时间代表创建比较早,把创建早的排在后面。\那你需要把你的比较规则帖出来,再把一些例子帖出来规则如下:
    pinned是置顶消息,置顶的靠前,置顶消息优先级最高
    然后就是比较是否有草稿,有草稿的靠前,它的优先级是第二
    然后就是创建时间,创建时间晚的靠前,如果三个都相等就认为相等
      

  5.   

    if (TextUtils.isEmpty(l) == TextUtils.isEmpty(r)) { //草稿
                            long ll = StringUtils.stringToLong(lhs.createdAt);
                            long rr = StringUtils.stringToLong(rhs.createdAt);
                            if (ll == rr) { //创建时间
                                return 0;
                            } else {
                                return ll < rr ? 1 : -1;
                            }
                        }else { //否则有草稿的地方为小
                            return TextUtils.isEmpty(l) ? 1 : -1;
                        }
    如果草稿两个都不是空的怎么比较?