当我使用下面的比较器对我正在获得的对象进行排序时,比较方法违反了比较器中的一般合同问题。
host.xml
答案 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.subtract
和BigInteger.compare
。
答案 1 :(得分:1)
通过使用BigInteger.intValue,您只需假设所有数字都适合简单整数。
由于BigInteger是Comparable,你应该依赖BigInteger.compare而不是比较int值。