使用java 8功能(stream,lambda等)按降序排序int数组

JBT*_*JBT 5 java java-8

令人惊讶的是,似乎在java中没有简单的单行解决方案在java 8之前按降序排序int数组.例如,检查这篇文章.现在我们有了java 8,是否有一种优雅,简单,单行的方式使用java 8特性,比如stream和lambda表达式,按降序排序int数组?

编辑
我对解决方案感兴趣int[],而不是Integer[].

编辑
我对仅使用JAVA SE库的解决方案感兴趣.

Psh*_*emo 9

用番石榴你可以简单地写

Ints.asList(a).sort(Comparator.reverseOrder());
Run Code Online (Sandbox Code Playgroud)

它可能不是那么有效,因为它需要拳击int到整数,但它是优雅的单行.

你也可以写点东西

int[] sorted = IntStream.of(a)
        .boxed()
        .sorted(Comparator.reverseOrder())
        .mapToInt(i -> i)
        .toArray();
Run Code Online (Sandbox Code Playgroud)

但这也遭受拳击,它需要创建新的阵列.

无论如何,我怀疑你会发现标准Java免费拳击的好解决方案,因为Comparator<T>只能接受对象.现在最好的方法是Arrays.sort手动使用和反转其订单.

  • 在我的[StreamEx](https://github.com/amaembo/streamex)库中有一个[快捷方式](http://amaembo.github.io/streamex/javadoc/javax/util/streamex/IntStreamEx.html#reverseSorted - )为此:`IntStreamEx.of(a).reverseSorted().toArray()`(在内部执行相同的装箱/拆箱).在JDK中,没有现成的算法来使用自定义比较器对原始数组进行排序,因此如果没有中间装箱(或实现这种原始排序的某些第三方库),则无法做到这一点. (3认同)

Ale*_* C. 5

int[] arr = ...;
Arrays.sort(arr);
int[] reversed = IntStream.range(0, arr.length)
                          .map(i -> arr[arr.length-i-1])
                          .toArray();
Run Code Online (Sandbox Code Playgroud)

如果您不想将int数组中的每个值装入其各自的包装类中,则可能是最接近的方法。

O(nlogn)如果您因执行一次排序 ( ) 和 () 之后执行反向操作而受到性能影响O(n),您可能需要研究Arrays.parallelSort并并行化IntStream.