如何以相反的顺序对IntStream进行排序

Aur*_*mae 13 java java-8 java-stream

我正在使用.txt文件读取数字BufferedReader.我想颠倒这种蒸汽中元素的顺序,这样当它们被收集时,它们将从最高到最低排列.我不想在构建数组后进行排序,因为我不知道它中可能有多少个元素,我只需要最高的N个元素.

in = new BufferedReader(reader);
                int[] arr = in.lines()
                        .mapToInt(Integer::parseInt)
                        .sorted()
                        .limit((long) N)
                        .toArray();
Run Code Online (Sandbox Code Playgroud)

小智 13

在排序之前尝试否定值并在排序后否定(恢复正常):

in = new BufferedReader(reader);
int[] arr = in.lines()
              .mapToInt(Integer::parseInt)
              .map(i -> -i).sorted().map(i -> -i)
              .limit((long) N)
              .toArray();
Run Code Online (Sandbox Code Playgroud)

  • 很酷的技巧,但如果输入包含`Integer.MIN_VALUE`则会出现问题. (3认同)
  • @TagirValeev然后你可以切换到`.map(i-> ~i)`而不是`.map(i - > - i)`. (3认同)

rge*_*man 6

由于反向顺序不是自然顺序,sorted()因此不能用于反向排序。如果IntStream使用Stream<Integer>来代替,则可以使用Collections.reverseOrder()来以与自然顺序相反的顺序对流进行排序。然后,您可以致电mapToInt并转换为int[]。

int[] arr = in.lines()
            .map(Integer::valueOf)  // Extract Integer, not int
            .sorted(Collections.reverseOrder())  // On Stream<Integer>
            .limit(N)
            .mapToInt(i -> i)       // map Integer to int
            .toArray();
Run Code Online (Sandbox Code Playgroud)

  • 我认为 `i -&gt; i` 可能是 `Integer::intValue`,对吧? (2认同)