Collections.sort(slg, (o1,o2) -> { if (ObjectUtil.isNull(o1.get(10))||ObjectUtil.isEmpty(o1.get(10))||ObjectUtil.isNull(o2.get(10))||ObjectUtil.isEmpty(o1.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); }); java.lang.IllegalArgumentException: Comparison method violates its general contract!
时间: 2024-03-08 09:46:15 浏览: 97
这个错误通常是由于您的比较器实现不符合Java中比较器的约定所导致的。具体来说,您的比较器实现中存在如下问题:
1. 比较器实现不满足自反性,因为对于某些元素,比较器返回-1,但是对于这些元素本身来说,它们是相等的,即o1和o2相等。
2. 比较器实现不满足传递性,因为对于某些元素,比较器可能返回-1或1,但是这些元素实际上是相等的,即o1和o2相等。
要解决这个问题,您需要修改比较器的实现,以满足Java中比较器的约定。具体来说,您可以按照以下步骤进行修改:
1. 在比较器中添加一个判断,如果两个元素相等,则返回0。
2. 在比较器中添加一个判断,如果两个元素不相等,则返回它们之间的比较结果。
3. 将比较器的实现改为只比较o1和o2中第10个值中的中文部分,而不是整个字符串。这可以使用正则表达式来实现。
修改后的代码如下所示:
```
Collections.sort(slg, (o1, o2) -> {
if (ObjectUtil.isNull(o1.get(10)) || ObjectUtil.isEmpty(o1.get(10)) || ObjectUtil.isNull(o2.get(10)) || ObjectUtil.isEmpty(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]", "");
if (s1.equals(s2)) {
return 0;
} else {
return s1.compareTo(s2);
}
});
```
希望能帮到您!
阅读全文