Java数组按降序排序?

362

有没有简单的方法可以像在Arrays类中升序排序一样降序排序数组?

还是说我必须停止懒惰并自己完成此操作 :[


6
很多以下的解决方案适用于整数类型而不是int类型(确保你使用适当的类型)。 - Manish Jain
29个回答

435
您可以使用此方法对各种对象进行排序。
sort(T[] a, Comparator<? super T> c) 

Arrays.sort(a, Collections.reverseOrder());

Arrays.sort()方法不能直接用于对原始数组进行降序排序。如果您尝试通过传递由Collections.reverseOrder()定义的反向Comparator来调用Arrays.sort()方法,则会抛出以下错误:

no suitable method found for sort(int[],comparator)

这种方法可以用于“对象数组”,例如整数数组,但是无法用于原始数组,例如整型数组。

对原始数组进行降序排序的唯一方法是,首先按升序排序数组,然后在原地翻转数组。对于二维原始数组也是如此。


178
它无法对基本类型的数组进行排序。 - Masood_mj
15
将您的原始数据类型转换为对应的对象类型。例如,将int转换为Integer,将double转换为Double,将boolean转换为Boolean等。 - Ishmael
14
如果你仍然想使用你自己的比较器comparatorCollections.reverseOrder(this) - Sebastian Hojas
Collections.reverseOrder() 不需要参数(除非我漏掉了什么?),我使用了 myComparator.reversed()。 - jsaven
我使用以下代码(示例):Comparator<AdMessage> notificationDataComparator = Collections.reverseOrder(GenericComparator .<AdMessage>createComparator(AdMessage.CREATED_AT_COMPARATOR)); Collections.sort(allMessageList, notificationDataComparator); - Alexei
显示剩余2条评论

115

列表

Collections.sort(list, Collections.reverseOrder());

对于一个数组

Arrays.sort(array, Collections.reverseOrder());

70
int[] array = {2,4,3,6,8,7}; Arrays.sort(array,Collections.reverseOrder()); 出错了!错误原因:"The method sort(int[]) in the type Arrays is not applicable for the arguments (int[], Comparator<Object>)"。 - Dixit Singla
14
int不是一个对象。尝试使用Integer[]代替。 - Ornithopter
6
int 是一种基本类型,而 Integer 不是。这就是为什么 Integer 有像 parse、toString 等方法的原因。 - Ornithopter

90
您可以使用以下内容:
    Arrays.sort(data, Collections.reverseOrder());

Collections.reverseOrder()返回一个使用相反自然顺序的Comparator。您可以使用Collections.reverseOrder(myComparator)获取自己比较器的反转版本。


16
OP希望对数组进行排序。Collections.sort()需要一个List作为输入参数,而不是一个数组。 - Pascal Thivent

84

一个替代方案(针对数字!!!)可能是

  1. 将数组乘以-1
  2. 排序
  3. 再次乘以-1

字面意思:

array = -Arrays.sort(-array)

11
如果我们在对数字进行排序,这种方法实际上是很有创意的,尽管它不是通用的,并且可能会引起溢出的问题... - hackjutsu
7
这是关于基本类型的非常好的答案。你很聪明。 - Halil İbrahim Oymacı
4
除了对于Integer.MIN_VALUE(或使用的任何其他基本类型)会失败之外。最好进行sort(),然后再进行reverse(),但是你需要自己执行反转操作,因为它们没有添加Arrays.reverse()实现。 - Andreas
2
@Halil İbrahim Oymacı:数组语法对我不起作用:“一元运算符'-'的操作数类型int[]无效”。 - Line
9
你需要把数组中的所有元素乘以-1。以上代码是伪代码。你可以在for循环中将数组中的所有元素乘以-1,然后调用Array.sort()方法,最后再将数组中的所有元素乘以-1。 - Halil İbrahim Oymacı

54

没有显式比较器:

Collections.sort(list, Collections.reverseOrder());

使用显式比较器:

Collections.sort(list, Collections.reverseOrder(new Comparator()));

28

使用Arrays.sort()和Collections.reverseOrder()无法直接对原始类型数组(即int[] arr = {1, 2, 3};)进行反向排序,因为这些方法要求参考类型(Integer)而不是原始类型(int)。

但是,我们可以使用Java 8 Stream先将数组装箱以便进行反向排序:

// an array of ints
int[] arr = {1, 2, 3, 4, 5, 6};

// an array of reverse sorted ints
int[] arrDesc = Arrays.stream(arr).boxed()
    .sorted(Collections.reverseOrder())
    .mapToInt(Integer::intValue)
    .toArray();

System.out.println(Arrays.toString(arrDesc)); // outputs [6, 5, 4, 3, 2, 1]

我假设时间复杂度仍然是O(nlgn),因为流式传输值和映射是在同一“级别”上完成的(这意味着整个代码的时间复杂度类似于(n + nlgn + n)?但如果我错了,请纠正我。 - Owen
这太棒了。谢谢你的帮助,但我现在讨厌Java哈哈。 - JBoothUA

16

首先,您需要使用以下方式对数组进行排序:

Collections.sort(myArray);

然后您需要使用以下方式将顺序从升序更改为降序:

Collections.reverse(myArray);

9

Java 8:

Arrays.sort(list, comparator.reversed());

更新: reversed() 方法可以反转指定的比较器。通常,比较器按升序排序,使用该方法可以将顺序更改为降序。

4
对于对象来说,它可以完美运行,但对于基本数据类型却不行。如果要对基本数据类型int进行排序,你需要先按照升序排序,然后再将结果反转。 - Ruslan Skaldin

5

如果一个数组是 Integer 类型的,则可以使用以下方法:

Integer[] arr = {7, 10, 4, 3, 20, 15};
Arrays.sort(arr, Collections.reverseOrder());

当数组是 int 数据类型时,您可以使用以下内容:

int[] arr = {7, 10, 4, 3, 20, 15};
int[] reverseArr = IntStream.rangeClosed(1, arr.length).map(i -> arr[arr.length-i]).toArray();

这只是将数组反转了。问题是将数组按降序排列。 - Raj Rajeshwar Singh Rathore

5

如果数组中包含基本类型元素,如果可以使用org.apache.commons.lang(3),则反转数组(排序后),可以使用以下方法:

ArrayUtils.reverse(array);

1
为什么要先按升序排序,然后再使用外部库来反转这个顺序,当可以一步完成时呢? - Betlista
1
那个步骤是什么? - Josip Maslac
5
是的,但(正如那些答案的评论中所述),这对于我回答的原始类型不起作用。当然,我的答案肯定不是最优解,但我发现它满足了原始作者强调的“简单”标准——即Arrays.sort(primitives); ArrayUtils.reverse(primitives); - Josip Maslac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接