小编典典

为什么我的简单比较器坏了?

java

我有一堂课,我已经简化为:

final class Thing {
    private final int value;
    public Thing(int value) {
        this.value = value;
    }
    public int getValue() {
        return value;
    }
    @Override public String toString() {
        return Integer.toString(value);
    }
}

我想对这个东西进行排序。所以我创建了一个简单的copmarator:

private static final Comparator<Thing> reverse = new Comparator<Thing>() {
    public int compare(Thing a, Thing b) {
        return a.getValue() - b.getValue();
    }
};

然后,我使用的两个参数形式Arrays.sort

这对于我的测试用例来说很好用,但是有时由于数组以奇怪但可重复的顺序结束而完全出错。怎么会这样?


阅读 297

收藏
2020-11-16

共1个答案

小编典典

整数溢出…或更确切地说是下溢。

相反,进行显式比较:

private static final Comparator<Thing> reverse = new Comparator<Thing>() {
    public int compare(Thing a, Thing b) {
      int av = a.getValue(), bv = b.getValue();
      return (av == bv) ? 0 : ((av < bv) ? -1 : +1);
    }
};

如果您确定差异不会“绕回”,则可以使用减法。例如,当所讨论的值被约束为非负数时。

2020-11-16