首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Collections.sort()工作,但Collections.reverseOrder()中断

Collections.sort()工作,但Collections.reverseOrder()中断
EN

Stack Overflow用户
提问于 2014-12-11 15:28:43
回答 2查看 227关注 0票数 2

所以我有一行代码,如下所示:

代码语言:javascript
复制
Collections.sort(lists, new SpecificComparator());

效果很好。但当我试图让它降序的时候..。

代码语言:javascript
复制
Collections.sort(lits, Collections.reverseOrder(new SpecificComparator()));

..。除以下例外外,它还会中断:

代码语言:javascript
复制
java.lang.IllegalArgumentException: Comparison method violates its general contract!

当我搜索异常消息时,我找到了this Q&A,说明这是因为这种关系不是传递的。我想我有点搞不懂一段关系是如何在一个方向上而不是在另一个方向上过渡的。我对传递性的理解是A == B && B == C -> A == C所以..。

这是我的比较器:

代码语言:javascript
复制
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();
    }

}

..。

代码语言:javascript
复制
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);
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-11 15:41:49

如果您的两个项目都被取消资格,您的比较器将始终返回1,这是错误的。

添加检查情况,当您的两个项目被取消资格,您的问题将得到解决。

票数 4
EN

Stack Overflow用户

发布于 2014-12-11 15:42:53

你的比较器当然不是传递性的。

确保A,B和C三项,如果A>B和B> C,那么A> C,那么你就没事了

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27426417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档