Collections.sort异常Comparison method violates its general contract!
时间: 2024-06-30 10:00:31 浏览: 20
在Java集合框架中,`Collections.sort()`方法用于对列表进行排序。如果在排序过程中抛出`ComparisonMethod violates its general contract!`这个异常,通常意味着你提供的比较器(`Comparator`)在执行比较操作时违反了比较器的一般合同。这个合同定义了一个排序方法应遵守的基本规则:
1. 必须对于所有非相等的对象调用`compare()`方法,结果要么是正数、负数或零,表示第一个对象大于、小于或等于第二个对象。
2. 对于所有相同的对象,`compare()`方法必须返回0。
当比较器不满足这些规则时,例如返回了错误的比较结果,`Collections.sort()`就会抛出异常。这可能是因为比较器实现了错误的逻辑,或者是在特定情况下导致无法正确确定两个元素的顺序。
要解决这个问题,你需要检查并修正你的`Comparator`实现,确保它在所有合法的情况下都能按照预期返回正确的比较结果。如果你不确定如何修复,可以提供具体的比较器代码,这样我可以帮助你找到问题所在。
相关问题
会出现Comparison method violates its general contract!吗
"Comparison method violates its general contract!" 是一个Java运行时错误,通常发生在使用Collections.sort()或者Arrays.sort()对对象数组或者集合进行排序时。这个错误的出现,是因为在自定义的compareTo()方法或者Comparator中,违反了比较契约的一些基本原则,例如:
1. 自反性:对于任何非null的引用值x,要求x.compareTo(x)必须返回0。
2. 对称性:对于任何非null的引用值x和y,当且仅当y.compareTo(x)返回0时,x.compareTo(y)也必须返回0。
3. 传递性:对于任何非null的引用值x、y和z,如果x.compareTo(y)>0且y.compareTo(z)>0,那么x.compareTo(z)也应该大于0。
4. 一致性:对于任何非null的引用值x和y,只要equals(x, y)为true,那么x.compareTo(y)必须返回0。
如果你的compareTo()方法或者Comparator违反了这些原则,就可能引发"Comparison method violates its general contract!"错误。
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!"异常。
相关推荐
![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)