我有例如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());