Java 8比较方法违反了比较器中的一般合同问题

时间:2017-06-14 07:24:47

标签: java sorting java-8 comparator

当我使用下面的比较器对我正在获得的对象进行排序时,比较方法违反了比较器中的一般合同问题。

host.xml

2 个答案:

答案 0 :(得分:5)

Comparator必须对其比较的对象强制执行总排序。特别地,这意味着它必须是可传递的,即,如果a小于b,并且b小于c,那么a必须是小于c。您的Comparator没有该属性。

考虑以下示例:

a.getX0() == 1    b.getX0() == 2    c.getX0() == 3
a.getX1() == 4    b.getX1() == 5    c.getX1() == 6
a.getY0() == 4    b.getY0() == 0    c.getY0() == -4

然后认为a小于b(y0的差异小于5),b小于c(差异是y0是小于5),但a不小于c(y0的差值大于5,因此取y0值)。

这三个对象应按什么顺序排序?

此外,您的代码还有其他问题。如果将所有内容转换为int,可能会发生溢出(这也可能导致您提到的异常)。当数据存储为BigInteger时,您还应使用BigInteger进行比较,例如方法BigInteger.subtractBigInteger.compare

答案 1 :(得分:1)

通过使用BigInteger.intValue,您只需假设所有数字都适合简单整数。

由于BigInteger是Comparable,你应该依赖BigInteger.compare而不是比较int值。