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