我有例如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的第一个参数,包含在内,这意味着您将始终提取负数。

解:


实际上,您需要比较整数而不是字符串。
子字符串的第一个参数实际上应为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());

10-05 21:09