在Java中使用stream.sorted()进行排序
例如,我有一个元素列表,如sg-1、sg-5、sg-13、sg-6等,我需要按数字对它们进行排序。 我的代码部分是:在Java中使用stream.sorted()进行排序,java,sorting,java-stream,comparator,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())
}).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]
如何排序,请帮助我:)请尝试一下
List<String> result = list.stream().distinct().sorted((a1,a2)->{
return Integer.compare(Integer.parseInt(a1.split("-")[1]), Integer.parseInt(a2.split("-")[1]));
}).collect(Collectors.toList());
List result=List.stream().distinct().sorted((a1,a2)->{
返回Integer.compare(Integer.parseInt(a1.split(“-”[1]),Integer.parseInt(a2.split(“-”[1]);
}).collect(Collectors.toList());
请尝试一下
List<String> result = list.stream().distinct().sorted((a1,a2)->{
return Integer.compare(Integer.parseInt(a1.split("-")[1]), Integer.parseInt(a2.split("-")[1]));
}).collect(Collectors.toList());
List result=List.stream().distinct().sorted((a1,a2)->{
返回Integer.compare(Integer.parseInt(a1.split(“-”[1]),Integer.parseInt(a2.split(“-”[1]);
}).collect(Collectors.toList());
你做错的第一件事是,你在按字典顺序比较字符串,而不是你所期望的整数
其次,即使将c1.substring(c1.indexOf(“-”,c1.length())
转换为整数,然后进行比较,仍然会得到错误的结果
为什么呢
这是因为c1.substring(c1.indexOf(“-”),c1.length())
,substring的第一个参数是包含的,这意味着您将始终提取负数
解决方案:
c1。indexOf(“-”)+1
以“-”开头你做错的第一件事是,你在按字典顺序比较字符串,而不是像你预期的那样比较整数 其次,即使将
c1.substring(c1.indexOf(“-”,c1.length())
转换为整数,然后进行比较,仍然会得到错误的结果
为什么呢
这是因为c1.substring(c1.indexOf(“-”),c1.length())
,substring的第一个参数是包含的,这意味着您将始终提取负数
解决方案:
c1。indexOf(“-”)+1
以“-”开头这是可行的,但你能解释一下,这些[1]是什么意思吗?为什么我的代码没有得到排序结果呢?考虑到破折号(-),这段代码会分割单个字符串。然后取字符串的第二部分,即末尾的数字。对于“sg-1”,将其分为“sg”和“1”。它获取数字并将其转换为整数并进行比较。希望这有帮助。避免使用原始类型。使用泛型更好。此外,您当前的方法效率低下,因为每次调用排序的函数时都会创建两个数组对象,这是可以避免的。它是有效的,但您能解释一下,这些[1]是什么意思吗?为什么我的代码没有得到排序结果呢?考虑到破折号(-),这段代码会分割单个字符串。然后取字符串的第二部分,即末尾的数字。对于“sg-1”,将其分为“sg”和“1”。它获取数字并将其转换为整数并进行比较。希望这有帮助。避免使用原始类型。使用泛型更好。此外,您当前的方法效率低下,因为每次调用函数to
sorted
时都会创建两个数组对象,这是可以避免的。c1.substring(c1.indexOf(“-”),c1.length())返回带破折号(-)的值,破折号被视为负数。例如,您的代码将返回-1,-5,-13而不是1,5,13,您可以使用c1.substring(c1.indexOf(“-”)+1,c1.length())跳过破折号(-)。我不明白你为什么要使用map。所以,是的,你是对的,但是我尝试过使用。排序((c1,c2)->c1.子字符串(c1.indexOf(“-”)+1,c1.length())。比较(c2.子字符串(c2.indexOf(“-”+1,c2.length()))。收集(collector.toList());但它不起作用。可能是“comparedTo”,如果数字不是字符串int或整数,则无法正确排序?c1。子字符串(c1.indexOf(“-”),c1.length())返回一个带破折号(-)的值,该破折号被视为负数。例如,您的代码将返回-1,-5,-13而不是1,5,13,您可以使用c1.substring(c1.indexOf(“-”)+1,c1.length())跳过破折号(-)。我不明白你为什么要使用map。所以,是的,你是对的,但是我尝试过使用。排序((c1,c2)->c1.子字符串(c1.indexOf(“-”)+1,c1.length())。比较(c2.子字符串(c2.indexOf(“-”+1,c2.length()))。收集(collector.toList());但它不起作用。可能是“comparedTo”无法正确排序数字,如果它们是字符串而不是int或整数?请注意,substring
有一个单参数版本,它已经暗示将length()
作为第二个参数。此外,如果您可以排除前导零,那么在进行长度比较之前,您可以使用字符串比较:Comparator.comparingit((string s)->s.length()-s.indexOf(“-”),然后比较(s->s.substring(s.indexOf(“-”)+1))
@Holger good shout!在写这篇文章的时候,我完全忘记了这一点,也感谢下面的建议。请注意,substring
有一个单参数版本,它已经将length()
作为第二个参数。此外,如果您可以排除前导零,那么在进行长度比较之前,您可以使用字符串比较:Comparator.comparingit((string s)->s.length()-s.indexOf(“-”),然后比较(s->s.substring(s.indexOf(“-”)+1))
@Holger good shout!在写这篇文章的时候,我完全忘记了这一点,也感谢下面的建议。一如既往地感谢你。
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());