Comparison method violates its general contract!
时间: 2023-11-11 11:50:34 浏览: 41
"Comparison method violates its general contract!"这个异常通常在Java中进行排序时会出现。它表示在自定义比较方法(compare method)中存在一种违反排序规则的情况。一般来说,自定义的比较方法必须满足可传递性(transitivity)、对称性(symmetry)和反自反性(antisymmetry)这三个排序规则。
可传递性要求:如果a大于b,b大于c,那么a必须大于c;
对称性要求:如果a等于b,那么b也等于a;
反自反性要求:如果a大于b,那么b不能大于a。
在你的引用中,问题出现在通过lambda表达式重写compare方法时。这个重写的比较方法没有遵守排序规则,导致抛出了这个异常。
解决这个问题的方法是根据具体的比较需求来修改自定义的比较方法,确保它满足排序规则。你可以检查你的比较方法是否满足以下条件:
- 可传递性:确保在比较时不会出现矛盾的情况。
- 对称性:确保在比较时不会出现互相矛盾的情况。
- 反自反性:确保在比较时不会出现自相矛盾的情况。
如果你的比较方法违反了排序规则,你需要根据具体情况进行修改,使其满足排序规则。
相关问题
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"错误?
java Comparison method violates its general contract!
当在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);
}
});
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)