所以我有一行代码,如下所示:
Collections.sort(lists, new SpecificComparator());效果很好。但当我试图让它降序的时候..。
Collections.sort(lits, Collections.reverseOrder(new SpecificComparator()));..。除以下例外外,它还会中断:
java.lang.IllegalArgumentException: Comparison method violates its general contract!当我搜索异常消息时,我找到了this Q&A,说明这是因为这种关系不是传递的。我想我有点搞不懂一段关系是如何在一个方向上而不是在另一个方向上过渡的。我对传递性的理解是A == B && B == C -> A == C所以..。
这是我的比较器:
public class SuperComparator implements Comparator<Item> {
@Override
public int compare(Item first, Item second) {
Result a = first.getResult();
Result b = second.getResult();
if(a == null && b == null) return 0;
if(b == null || b == Result.DISQUALIFIED) return 1;
if(a == null || a == Result.DISQUALIFIED) return -1;
return b.getIntValue() - a.getIntValue();
}
}..。
public class SpecificComparator extends SuperComparator {
@Override
public int compare(Item first, Item second) {
int rank = super.compare(first, second);
if(rank != 0) return rank;
BigDecimal thisAmount = first.getAmount() != null ? first.getAmount() : BigDecimal.ZERO;
BigDecimal otherAmount = second.getAmount() != null ? second.getAmount() : BigDecimal.ZERO;
return thisAmount.compareTo(otherAmount);
}发布于 2014-12-11 15:41:49
如果您的两个项目都被取消资格,您的比较器将始终返回1,这是错误的。
添加检查情况,当您的两个项目被取消资格,您的问题将得到解决。
发布于 2014-12-11 15:42:53
你的比较器当然不是传递性的。
确保A,B和C三项,如果A>B和B> C,那么A> C,那么你就没事了
https://stackoverflow.com/questions/27426417
复制相似问题