java Comparison method violates its general contract!
时间: 2024-02-01 16:10:54 浏览: 125
当在Java中使用`Collections.sort()`方法对列表进行排序时,有时会出现异常`Comparison method violates its general contract`。这个异常表示比较方法违反了其一般约定。
异常的原因是在比较方法中使用了错误的方式进行比较。在引用中的例子中,比较方法使用了三元运算符进行比较,这是错误的方式。
为了解决这个问题,可以采取以下两种方法之一:
1. 修改比较方法,使用`compareTo()`方法进行比较。`compareTo()`方法是Java中用于比较两个对象的方法,它返回一个整数值,表示两个对象的大小关系。正确的比较方法应该是`return o1.compareTo(o2)`。
2. 在JVM启动参数中增加`-Djava.util.Arrays.useLegacyMergeSort=true`。这个参数会使用旧版本的排序算法,可以避免出现该异常。
下面是修改后的比较方法的示例代码:
```java
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
```
相关问题
Comparison method violates its general contract!
"Comparison method violates its general contract!" 是Java中常见的一种异常,通常会在使用Collections.sort()或Arrays.sort()等排序方法时抛出。它的产生是由于比较器(Comparator)的实现不符合比较器的规范所致。
比较器的规范要求,如果有三个元素a、b、c,当a和b相等,b和c相等时,a和c也应该相等。如果比较器的实现不满足这个规范,就会产生"Comparison method violates its general contract!"异常。这个异常的出现通常意味着比较器的实现出现了一些逻辑错误,需要重新检查。
下面是一个常见的比较器实现错误:
```java
Comparator<Integer> cmp = new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return a % 10 - b % 10;
}
};
```
这个比较器的实现不符合比较器的规范,例如当输入为10、20、30时,会得到一个错误的结果。正确的实现方式是:
```java
Comparator<Integer> cmp = new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
if (a % 10 == b % 10) {
return a - b;
}
return a % 10 - b % 10;
}
};
```
这样实现的比较器满足比较器的规范,不会产生"Comparison method violates its general contract!"异常。
comparison method violates its general contract!
"comparison method violates its general contract"是一个错误消息,通常在Java中使用Comparable或Comparator接口进行对象比较时出现。这个错误消息表示实现了Comparable或Comparator接口的类的比较方法违反了其约定。
在Java中,当我们实现Comparable接口时,需要重写compareTo方法;当我们使用Comparator接口时,需要重写compare方法。这些方法用于定义对象之间的比较规则。
当出现"comparison method violates its general contract"错误消息时,意味着比较方法的实现不符合比较的一般约定。这些约定包括:
1. 自反性(Reflexivity):对于任何非null的引用值x,x.compareTo(x)应该返回0。
2. 对称性(Symmetry):对于任何非null的引用值x和y,如果x.compareTo(y)返回0,则y.compareTo(x)也应该返回0。
3. 传递性(Transitivity):对于任何非null的引用值x、y和z,如果x.compareTo(y)返回0,并且y.compareTo(z)返回0,则x.compareTo(z)也应该返回0。
4. 一致性(Consistency):对于任何非null的引用值x和y,如果没有修改x和y之间的比较信息,则多次调用x.compareTo(y)应该返回相同的结果。
5. 非空性(Non-nullity):对于任何非null的引用值x和y,x.compareTo(y)不应该抛出NullPointerException。
如果实现的比较方法违反了上述约定中的任何一条,就会出现"comparison method violates its general contract"错误消息。
为了解决这个问题,需要检查比较方法的实现,确保它满足上述约定。可能需要修复比较方法的逻辑或者处理特殊情况,以确保比较方法的正确性。
相关问题--:
1. 什么是Comparable接口和Comparator接口?
2. 如何实现Comparable接口和Comparator接口?
3. 如何避免"comparison method violates its general contract"错误?
阅读全文