使用Java8特性(流、lambda等)按降序对int数组排序

使用Java8特性(流、lambda等)按降序对int数组排序,java,java-8,Java,Java 8,令人惊讶的是,在Java8之前,java中似乎没有一种简单的线性解决方案可以按降序对int数组进行排序。例如,检查。现在我们有了Java8,是否有一种优雅、简单、单行程序的方法,使用Java8特性(如流和lambda表达式)按降序对int数组进行排序 编辑 我对int[]的解决方案感兴趣,而不是Integer[] 编辑 我对只使用JavaSE库的解决方案感兴趣。使用番石榴,您只需编写 Ints.asList(a).sort(Comparator.reverseOrder()); 它可能效率不高

令人惊讶的是,在Java8之前,java中似乎没有一种简单的线性解决方案可以按降序对int数组进行排序。例如,检查。现在我们有了Java8,是否有一种优雅、简单、单行程序的方法,使用Java8特性(如流和lambda表达式)按降序对int数组进行排序

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

编辑

我对只使用JavaSE库的解决方案感兴趣。

使用番石榴,您只需编写

Ints.asList(a).sort(Comparator.reverseOrder());
它可能效率不高,因为它需要将int装箱到Integer,但它是一个优雅的单行程序

你也可以写类似的东西

int[] sorted = IntStream.of(a)
        .boxed()
        .sorted(Comparator.reverseOrder())
        .mapToInt(i -> i)
        .toArray();
但这也会受到装箱的影响,需要创建新的阵列

无论如何,我怀疑你会在标准Java中找到一个好的解决方案,因为
Comparator
只能接受对象。目前最好的方法是使用
数组。对
进行排序并手动反转顺序

int[] arr = ...;
Arrays.sort(arr);
int[] reversed = IntStream.range(0, arr.length)
                          .map(i -> arr[arr.length-i-1])
                          .toArray();
如果您不想为数组中的每个值将
int
装箱到相应的包装类中,则可能是最接近的


如果执行一次排序(
O(nlogn)
)和之后的反向操作(
O(n)
)会影响性能,您可能需要查看
数组。parallelSort
并并行化
IntStream

可能的重复:您可以始终使用
数组。sort()
然后以相反的顺序迭代数组…在我的库中有一个用于此的函数:
IntStreamEx.of(a).reverseSorted().toArray()
(在内部执行相同的装箱/拆箱操作)。在JDK中,没有现成的算法可以使用自定义比较器对基元数组进行排序,因此如果没有中间装箱(或实现这种基元排序的第三方库),或者
IntStream.range(0,arr.length/2).forEach(i->{int tmp=arr[i];arr[i]=arr[arr.length-i-1];arr[arr.length-i-1]=tmp;})如果您想直接在
arr
中就地反转。