java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:777)
at java.util.TimSort.mergeAt(TimSort.java:514)
at java.util.TimSort.mergeCollapse(TimSort.java:439)
at java.util.TimSort.sort(TimSort.java:245)
at java.util.Arrays.sort(Arrays.java:1512)
at java.util.ArrayList.sort(ArrayList.java:1462)
排个序,还出bug啦,查啦下,还比较高级,
说是我们要排序的对象要建议实现满足对称性,传递性和自反性。说实话,这是啥啊,不造啊。我关心怎么解决问题。
我原来的排序是这么写的
/**
* 异步交易按创建时间降序排
*/
Ordering<AdaptiveTrace> ADAPTIVE_TRACE_DESC_ORDERING = new Ordering<AdaptiveTrace>() {
@Override
public int compare(AdaptiveTrace left, AdaptiveTrace right) {
if (left == null || left.getCreateAt() == null) {
return 1;
}
if (right == null || right.getCreateAt() == null) {
return -1;
}
return right.getCreateAt().compareTo(left.getCreateAt());
}
};
然后,这个代码就报错啦。说是因为,我这数据会出现同时为null空的情况。
然后,看怎么解决这个问题。
/**
* 别名方案按创建时间降序排
*/
Ordering<AliasScheme> ALIAS_SCHEME_DESC_ORDERING = new Ordering<AliasScheme>() {
@Override
public int compare(AliasScheme left, AliasScheme right) {
if (left == null && right == null) {
return 0;
}
if (left == null) {
return 1;
}
if (right == null) {
return -1;
}
if (left.getCreateAt() == null && right.getCreateAt() == null) {
return 0;
}
if (left.getCreateAt() == null) {
return 1;
}
if (right.getCreateAt() == null) {
return -1;
}
return right.getCreateAt().compareTo(left.getCreateAt());
}
};
看,这次的判断就比较完善啦。
然后,排序就OK啦。
然后,调用排序接口的地方的代码如下:
List<AliasScheme> aliasSchemes = Lists.newArrayList(aliasSchemeRepository.findAll());
aliasSchemes.sort(OrderingConstants.ALIAS_SCHEME_DESC_ORDERING);
然后就完事儿了。