Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用stream.sorted()进行排序_Java_Sorting_Java Stream_Comparator - Fatal编程技术网

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

在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())

例如,我有一个元素列表,如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] 如何排序,请帮助我:)

请尝试一下

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的第一个参数是包含的,这意味着您将始终提取负数

解决方案:

  • 实际上,您需要比较整数和字符串
  • substring的第一个参数实际上应该是
    c1。indexOf(“-”)+1
    以“-”开头


  • 你做错的第一件事是,你在按字典顺序比较字符串,而不是像你预期的那样比较整数

    其次,即使将
    c1.substring(c1.indexOf(“-”,c1.length())
    转换为整数,然后进行比较,仍然会得到错误的结果

    为什么呢

    这是因为
    c1.substring(c1.indexOf(“-”),c1.length())
    ,substring的第一个参数是包含的,这意味着您将始终提取负数

    解决方案:

  • 实际上,您需要比较整数和字符串
  • 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());