我有一个字符串列表,我想使用字符串中存在的最后一个数字对它们进行排序,我已经使用下面的代码尝试过此操作,但由于某些原因,它也会选择最后一个数字之前存在的数字,例如在“abc\xyz 2 5”字符串中,它选择了 25 而不是 5,因为它对它进行了错误的排序。我可以知道我的正则表达式中有什么不正确吗?
注意:我的最后两位数字始终是时间戳,例如 1571807700009 1571807700009。
这是我到目前为止所尝试过的。
public static void second() {
List<String> strings = Arrays.asList("abc\\xyz 2 5", "abc\\\\xyz 1 8", "abc\\\\xyz 1 9", "abc\\\\xyz 1 7", "abc\\\\xyz 1 3");
Collections.sort(strings, new Comparator<String>() {
public int compare(String o1, String o2) {
return (int) (extractInt(o1) - extractInt(o2));
}
Long extractInt(String s) {
String num = s.replaceAll("\\D", "");
return Long.parseLong(num);
}
});
System.out.println(strings);
}
输出
[abc\\xyz 1 3, abc\\xyz 1 7, abc\\xyz 1 8, abc\\xyz 1 9, abc\xyz 2 5]
预期输出
[abc\\xyz 1 3, abc\\xyz 2 5, abc\\xyz 1 7, abc\\xyz 1 8, abc\xyz 1 9]
最佳答案
使用流,通过用空字符串替换字符串的前一部分,仅对最后一个整数进行排序。您还可以通过将该值传递给比较方法来利用 API Comparator
接口(interface)。
List<String> strings = Arrays.asList("abc\\xyz 2 5", "abc\\\\xyz 1 8",
"abc\\\\xyz 1 9", "abc\\\\xyz 1 7", "abc\\\\xyz 1 3");
strings = strings.stream()
.sorted(Comparator.comparing(s -> Long.valueOf(s.replaceAll(".*\\s+", ""))))
.collect(Collectors.toList());
System.out.println(strings);
关于java - 正则表达式从字符串中检索最后一位数字并对它们进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58526045/