使用Java8特性(流、lambda等)按降序对int数组排序
令人惊讶的是,在Java8之前,java中似乎没有一种简单的线性解决方案可以按降序对int数组进行排序。例如,检查。现在我们有了Java8,是否有一种优雅、简单、单行程序的方法,使用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()); 它可能效率不高
我对
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
中就地反转。