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); }); 优化这段代码
时间: 2024-01-31 12:02:14 浏览: 515
这段代码的主要作用是对一个 List<Map<String, Object>> 的数据进行排序,排序的依据是这个 Map 中第 10 个元素的字符串形式中的汉字。对于这段代码的优化有以下几点建议:
1. 使用 Lambda 表达式来进行 Comparator 的实现,可以简化代码。
2. 对于 Map 中第 10 个元素为 null 的情况,可以直接跳过比较,不需要返回 -1。
3. 对于字符串中的汉字提取,可以使用正则表达式来进行,不需要对字符串进行多次操作。
综上所述,可以优化成以下代码:
```java
Collections.sort(slg, (o1, o2) -> {
String s1 = extractChinese(o1.get(10));
String s2 = extractChinese(o2.get(10));
return s1.compareTo(s2);
});
private String extractChinese(Object obj) {
if (ObjectUtil.isNull(obj)) {
return "";
}
String str = obj.toString();
return str.replaceAll("[^\\u4e00-\\u9fa5]", "");
}
```
其中,`extractChinese` 方法是用来提取字符串中的汉字的方法,可以在排序时使用。
相关问题
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!
这个错误通常是由于您的比较器实现不符合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);
}
});
```
希望能帮到您!
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); }); 部分较远数据排序失败
您好,我理解您的问题是在对一个 List 进行排序时,部分数据排序失败,可能是由于数据中的某些值为空引起的。您可以尝试对这些可能为空的值进行判空处理,避免出现空指针异常,如下所示:
```
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]", "");
if (StringUtils.isBlank(s1) || StringUtils.isBlank(s2)) {
return -1;
}
return s1.compareTo(s2);
});
```
这样做可以确保对可能为空的值进行处理,避免出现排序失败的情况。同时,您也可以加入日志输出,便于排查问题的原因。
阅读全文