Collections.sort(slg, (o1,o2) -> { if (ObjectUtil.isNull(o1.get(10))||ObjectUtil.isNull(o2.get(10))) { return 0; } String s1 = o1.values().toArray()[10].toString().replaceAll("[^\\u4e00-\\u9fa5]", ""); String s2 = o2.values().toArray()[10].toString().replaceAll("[^\\u4e00-\\u9fa5]", ""); return s1.compareTo(s2); }); Comparison method violates its general contract!怎么解决
时间: 2024-01-31 12:02:14 浏览: 65
出现 "Comparison method violates its general contract" 的原因是排序方法不满足强排序的要求,即排序方法返回的结果不具有传递性。解决这个问题的方法是保证排序方法的返回结果具有传递性。一般来说,一个排序方法应该满足以下三个要求:
1. 自反性:对于任意的 x,x=x。
2. 对称性:对于任意的 x 和 y,如果 x<y,则 y>x。
3. 传递性:对于任意的 x、y、z,如果 x<y,y<z,则 x<z。
根据这个要求,应该避免在比较中返回 0,因为返回 0 会导致比较结果不具有传递性。可以将 0 改为 1 或 -1,或者直接将 null 视为最小或最大值进行比较,以确保排序方法返回的结果具有传递性。
所以,可以将代码中的返回 0 改为返回 -1,如下所示:
```java
Collections.sort(slg, (o1, o2) -> {
if (ObjectUtil.isNull(o1.get(10)) || ObjectUtil.isNull(o2.get(10))) {
return -1;
}
String s1 = o1.values().toArray()[10].toString().replaceAll("[^\\u4e00-\\u9fa5]", "");
String s2 = o2.values().toArray()[10].toString().replaceAll("[^\\u4e00-\\u9fa5]", "");
return s1.compareTo(s2);
});
```
这样就可以保证排序方法的结果具有传递性,不会出现 "Comparison method violates its general contract" 的问题。
阅读全文