gpt4 book ai didi

java - .compareTo() 与 2 个排序列

转载 作者:行者123 更新时间:2023-12-02 01:47:03 25 4
gpt4 key购买 nike

我正在尝试在 Java 中为需要按两个不同的列/变量进行排序的对象实现类似的接口(interface)。我尝试了多种方法,这是迄今为止最好的方法:

public int compareTo(Object o) {
Match m = (Match)o;
int diff = m.matches - matches;
if (diff == 0) {
if (distance > m.distance) {
return 1;
} else if (distance < m.distance) {
return -1;
} else {
return 0;
}
} else {
return diff;
}
}

但它仍然失败

java.lang.IllegalArgumentException: Comparison method violates its general contract!

知道我做错了什么吗?

旁注 1:如果 o 为 null 或属于不合适的类,则预计会出现 NPE/ClassCastExceptions - 这不是这里的问题。

旁注 2:我知道 change在 JDK 1.7 的排序算法中,但我真的不明白我在哪里违反了契约。因此关闭异常似乎是错误的解决方案。

最佳答案

既然你说distance是 double ,您可能会遇到与此处描述的相同的问题:

Java error: "Comparison method violates its general contract!"

也许:

public int compareTo(Object o) {
Match m = (Match)o;
int diff = m.matches - matches;
if (diff == 0) {
return Double.compare(distance, m.distance);
} else {
return diff;
}
}

但是理想情况下,您应该使用内置的比较方法,如下所示。上面的代码是“需要最少改动”的示例,说明了关键问题。

使用现有的比较方法

此外,正如 @fabian-barney 在他的回答中指出的那样,您应该避免采用直接差异,而应使用内置的比较方法。所以你应该有这样的东西:

public int compareTo(Object o) {
Match m = (Match) o;
return m.matches == matches ? Double.compare(m.distance, distance) : Integer.compare(m.matches, matches);
}

这边,Double.compare将为您处理 NaN 值。对于任何号码x (NaN 除外)Double.compare(x, Double.NaN) == -1将返回 true(即 NaN 被认为大于任何其他数字)。

请注意,您可以使用 ==int但它更复杂 double因为Double.NaN != Double.NaN 。然而,new Double(Double.NaN).equals(Double.NaN)是真的。请参阅Why is Java's Double.compare(double, double) implemented the way it is?进行愉快的讨论。

违反契约(Contract):

要查看一个示例,说明为什么如果您有 NaN,您的原始实现可能会违反约定,请参阅 Java compareTo documentation 。我们有:

Finally, the implementer must ensure that x.compareTo(y)==0 implies that sgn(x.compareTo(z)) == sgn(y.compareTo(z)), for all z.

假设你有x = NaNy = 5z = 6 ,那么:

  1. x.compareTo(y) == 0 (因为NaN > 5NaN < 5是假的)
  2. x.compareTo(z) == 0 (同样的道理)
  3. y.compareTo(z) == -1 (y < z)。

因此 2 和 3 (+ sgn ) 不等于所需的值。

关于java - .compareTo() 与 2 个排序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11495625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com