【发布时间】:2012-07-14 18:54:55
【问题描述】:
我正在尝试在 Java 中为需要按两个不同列/变量排序的对象实现可比较的接口。我尝试了多种方法,这是迄今为止最好的一种:
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:我知道 JDK 1.7 中排序算法中的 change,但我并没有真正看到我在哪里违反了合同。所以关闭异常似乎是错误的解决方案。
【问题讨论】:
-
你重写了
equals()方法吗? -
@Ray Toal:距离是双倍的。
-
你不需要覆盖
equals(),只是想知道它和compareTo()的行为可能导致违反一般合同。例如,.equals()返回 true,但compareTo()返回非零。 -
没有 NaN,你应该很好:ideone.com/u1HD9。使用 NaN,ideone 的 Java 7 仍然适用于我:ideone.com/OsixW。
-
完整堆栈跟踪:ideone.com/7GV37 匹配是一个整数,距离是一个双精度数,使用 2 个 lat/lng 对计算。这会导致 NaN 吗?
标签: java sorting collections comparable