有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java集合。sort()可以工作,但不支持集合。reverseOrder()中断

我有一行代码如下:

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);
    }

共 (2) 个答案

  1. # 1 楼答案

    如果您的两个项目都不合格,您的比较器将始终返回1,这是错误的

    当您的两个项目都不合格时,添加案例检查,您的问题将得到解决

  2. # 2 楼答案

    您的比较器当然不是可传递的

    确保对于3项A、B和C,如果A>;B和B>;C、 那么A>;C那你就没事了