java - 正则表达式从字符串中检索最后一位数字并对它们进行排序

标签 java regex sorting

我有一个字符串列表,我想使用字符串中存在的最后一个数字对它们进行排序,我已经使用下面的代码尝试过此操作,但由于某些原因,它也会选择最后一个数字之前存在的数字,例如在“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/

相关文章:

algorithm - 快速排序与堆排序

java - 使带有位置括号的对象类似于数组

java - 如何从 Java Servlet 中的 HttpServletRequest 获取文件

php - 如何使用 PHP 查找特定字符

python - DataFrame 列比较

regex - Grepping for the form action= 部分 html 页面

java - 使用选择排序(不使用 Array.sort)按字母顺序对数组进行排序

c++ - 在 C++ 中对多维数组进行排序

java - 从 xls 读取数据,使 xls 文件在 selenium 中损坏

java - 是否使用 Hibernate?