java - 在 Java 中使用 stream.sorted() 进行排序

标签 java sorting java-stream comparator

我有例如 sg-1、sg-5、sg-13、sg-6 等元素列表,我需要按数字对它们进行排序。 我的代码部分是:

}).map(c -> {
                System.out.println(c);
                return c;
            }).distinct()
            .sorted((c1, c2) -> c1.substring(c1.indexOf("-"), c1.length())
                    .compareTo(c2.substring(c2.indexOf("-"), c2.length())))
            .collect(Collectors.toList());

系统输出打印 sg-1 sg-1 sg-1 sg-9 sg-1 sg-4 sg-15 sg-1 sg-1 sg-1 sg-1

但最后我得到 [sg-1, sg-15, sg-4, sg-9] 但它必须是 [sg-1, sg-4, sg-9, sg-15] 如何对它们进行排序,请帮助我:)

最佳答案

您做错的第一件事是您按字典顺序比较字符串,而不是您可能期望的整数。

其次,即使您将 c1.substring(c1.indexOf("-"), c1.length()) 转换为整数,然后进行比较,您仍然会得到不正确的结果。

这是为什么?

这是因为c1.substring(c1.indexOf("-"), c1.length()),substring的第一个参数是包含的,这意味着你总是会提取负数。

解决方法:

  1. 您实际上需要比较整数而不是字符串。
  2. substring 的第一个参数实际上应该是 c1.indexOf("-") + 1,在“-”之后开始。

List<String> result = list.stream()
                .distinct()
                .sorted(Comparator.comparingInt(s -> 
                    Integer.parseInt(s.substring(s.indexOf("-") + 1, s.length()))))
                .collect(Collectors.toList());

顺便说一句,不要使用 map 来执行调试工作,而是使用 peek .

List<String> result = list.stream()
                 .peek(System.out::println)
                 .distinct()
                 .sorted(Comparator.comparingInt(s -> 
                     Integer.parseInt(s.substring(s.indexOf("-") + 1, s.length()))))
                 .collect(Collectors.toList());

关于java - 在 Java 中使用 stream.sorted() 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49801967/

相关文章:

java - 如何在Java中存储超过10位的数字

java - Mapstruct - 忽略嵌套类中的特定字段

java - 不推荐使用构造函数 Date(String)

MySQL 使用唯一约束更新 sort_order 字段会导致违反唯一约束

java - 使用 Java 8 Stream 对 HashMap String 值进行排序不起作用

java - 如何使用 Stream API 合并然后区分集合?

java - 在 Java8 中收集统计信息

java - Android以编程方式在按钮的右上角添加图片

php - 随机化 SQL 结果

python - 用 Python 绘制 15k 个城市 map 的有效方法