我有一堂课,我已经简化为:
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。
Arrays.sort
这对于我的测试用例来说很好用,但是有时由于数组以奇怪但可重复的顺序结束而完全出错。怎么会这样?
整数溢出…或更确切地说是下溢。
相反,进行显式比较:
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); } };
如果您确定差异不会“绕回”,则可以使用减法。例如,当所讨论的值被约束为非负数时。