当前位置: 首页 > 知识库问答 >
问题:

对流进行反向排序

魏鸿
2023-03-14

我想像下面这样对流进行反向排序,但是编译时错误为“IntStream类型中的sorted()方法不适用于参数( o1, o2)->{})” 。有人能纠正这个吗

IntStream.range(1, 100)
         .filter(x -> x%2 != 0)
         .sorted((o1,o2) -> -o1.compareTo(o2))
         .forEach(System.out::println);

共有1个答案

澹台新知
2023-03-14

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

相反,将intstream中的流框到stream 中,这样就足够了:

 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在评论中提到的:

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中,从文章中的代码开始,您可以首先通过iterate将其简化为:

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

通过这种方法,我们可以避免筛选装箱排序等。

 类似资料:
  • 我有这个列表,我想按保留顺序订购,但我没有在自动完成辅助中找到任何函数 我也尝试过: 但是我有编译错误:

  • 所以我遇到了这个方法,它能够按值对HashMaps进行排序。 我想在比较器上使用方法,但是我似乎找不到合适的地方放它。

  • 我正在使用java lambda对列表进行排序。 我怎样才能反向排序呢?

  • 问题内容: 我使用以下行以相反的顺序对浮点数组进行排序,但出现错误消息,这是什么问题? 错误:找不到符号 符号:方法sort(float [],java.util.Comparator)位置:类java.util.Arrays Arrays.sort(sortedData,Collections.reverseOrder()); ==================================

  • 问题内容: 我正在尝试对Go中的整数切片进行反向排序。 如何对它进行排序,使其从最高到最低?所以[25 5 4 3 1] 我已经试过了 资料来源:http : //golang.org/pkg/sort/#Reverse 但是,我得到下面的错误 问题答案: sort.Ints是对几个int进行排序的便捷函数。通常,如果要对某些内容进行排序和排序,则需要实现sort.Interface接口.Reve

  • 我有一个数据库表,我想对其进行筛选,然后按相反(降序)顺序进行排序。我如何在类似于以下内容的速度流中表达: 我希望我的SQL查询能够通过速度优化,因此我不能使用匿名lambda。