反向排序流

时间:2018-12-13 15:01:34

标签: java sorting java-8 java-stream

我想对流进行如下反向排序,但编译时错误为if ((*iter).my_state()) { auto splice_iter = iter; cache_list_individuals.splice(cache_list_individuals.begin(), list_individuals, splice_iter); } 。谁能纠正这个问题

"The method sorted() in the type IntStream is not applicable for the arguments ((<no type> o1, <no type> o2) -> {})"

3 个答案:

答案 0 :(得分:13)

说明

因为您使用的是IntStream,所以它只有sorted方法的一个重载,这是自然顺序(有意义)。

相反,将流IntStreamStream<Integer>的框装箱,这样就足够了:

 IntStream.range(1, 100)
          .filter(x -> x % 2 != 0)
          .boxed()  // <--- boxed to Stream<Integer>
          .sorted((o1,o2) -> -o1.compareTo(o2)) // now we can call compareTo on Integer
          .forEach(System.out::println);

但是,正如@Holger在评论中提到的那样:

  

切勿使用(o1,o2) -> -o1.compareTo(o2)之类的比较器函数。它   对于compareTo实现返回完全合法   Integer.MIN_VALUE,在这种情况下,否定将失败并产生   结果不一致。一个有效的反向比较器将是(o1,o2)->   o2.compareTo(o1)

改进代码的建议。 JDK8

更好的方法是:

IntStream.range(1, 100)
         .filter(x -> x % 2 != 0)
         .boxed()
         .sorted(Comparator.reverseOrder())
         .forEachOrdered(System.out::println);

为什么?

  • 已经有一个内置的比较器可以执行相反的顺序,如上所示。
  • 如果您想保证在打印时按排序顺序显示元素,则可以使用forEachOrdered(向@Holger大喊,总是提醒我)

或如@Holger所建议的那样,都可以简化为以下形式:

 IntStream.range(0, 50)
          .map(i -> 99-i*2)
          .forEachOrdered(System.out::println);

JDK9变体

顺便说一句,在JDK9中,从您发布的代码开始,您可以首先通过iterate将其简化为:

IntStream.iterate(1, i  -> i <= 99, i -> i + 2)
         .boxed()
         .sorted(Comparator.reverseOrder())
         .forEachOrdered(System.out::println);

使用这种方法,我们可以避免滤波器的中间操作和2的增量。

最后,您可以使用以下方法进一步简化它:

IntStream.iterate(99, i  -> i > 0 , i -> i - 2)
         .forEachOrdered(System.out::println);

使用这种方法,我们可以避免filterboxedsorted等。

答案 1 :(得分:4)

如果这是您的真实代码,那么使用IntStream.iterate并生成从990的数字可能会更有效:

IntStream.iterate(99, i -> i - 1)
    .limit(100)
    .filter(x -> x % 2 != 0)
    .forEachOrdered(System.out::println);

答案 2 :(得分:3)

简单的工具如:

private IntStream reverseSort(int from, int to) {
    return IntStream.range(from, to)
                    .filter(x -> x % 2 != 0)
                    .sorted()
                    .map(i -> to - i + from - 1);
}

信用 Stuart Marks for the reverse util