使用Java中的stream.sorted()进行排序

时间:2018-04-12 16:45:50

标签: java sorting java-stream comparator

我有例如sg-1,sg-5,sg-13,sg-6等elemenets列表,我需要按数字排序。 我的代码部分是:

}).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] 如何排序,请帮助我:) :( / p>

2 个答案:

答案 0 :(得分:4)

你做错的第一件事就是你按字典顺序比较字符串而不是你想象的整数。

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

为什么会这样?

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

解决方案:

  1. 你实际上需要比较整数而不是字符串。
  2. substring的第一个参数实际上应该是{ - 1}}在“ - ”之后开始。
  3. 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()); 执行调试工作,而是使用peek

    map

答案 1 :(得分:1)

请试一试