【发布时间】:2015-08-13 09:02:51
【问题描述】:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:747)
at java.util.TimSort.mergeAt(TimSort.java:483)
at java.util.TimSort.mergeCollapse(TimSort.java:408)
at java.util.TimSort.sort(TimSort.java:214)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at java.util.Collections.sort(Collections.java:217)
谁能解释为什么我下面的比较器有时会抛出上述异常。
注意:myObject 中的 id 字段是 long 类型。
Collections.sort(objectList, new Comparator<MyObject>() {
@Override
public int compare(final myObject myobject1, final MyObject myObject2) {
return (int)(myObject1.getId() - myObject2.getId());
}
});
解决方案:
根据@amit 的回答
return (int)(Long.compare(myObject1.getId(), myObject2.getId());
【问题讨论】:
-
myObject 应该有一个大写的 M - Java 代码约定不是可选的,类总是以大写字母开头。
-
@LionC 道歉,这是一个错字。这不是造成问题的原因。
-
@Eran 不,集合中不可能有空值
-
@LionC 代码约定始终是可选的;只是不建议偏离这样的惯例。
标签: java comparator