2009-11-07 54 views

回答

247

您可以使用此

sort(T[] a, Comparator<? super T> c) 

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

它无法对基元数组排序 –

+11

将您的基元转换为它们各自的对象。 Integer为int,double为double,布尔型为布尔值等。 – Ishmael

+10

如果您仍想使用自定义[comparator](http://docs.oracle.com/javase/7/docs/api/java/util/Comparator .html):'Collections.reverseOrder(this)' –

84

您可以使用此:

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

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

+6

OP想要对数组进行排序。 'Collections.sort()'把'List'作为输入参数,而不是数组。 –

+1

ops,我写了Collections而不是Arrays.Its现在已经更正了。 – William

+2

+1解释如何使用自己的比较器。 – dj18

74

为列表

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

用于阵列

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

int [] array = {2,4,3,6,8,7}; Arrays.sort(array,Collections.reverseOrder());给我一个错误! 错误的是:“类型数组中的方法sort(int [])不适用于参数(int [],比较器)” –

+3

int不是对象。尝试使用Integer []代替。 – Ornithopter

+0

为什么Integer []工作而不是int []? – OpMt

3

对于其中包含的原语元素,如果有org.apache.commons.lang(3)在处置容易的方式来扭转阵列(排序之后)阵列是使用:

ArrayUtils.reverse(array); 
+1

为什么要按升序对它进行排序,然后使用外部库恢复此顺序,何时可以在一个步骤中完成? – Betlista

+0

而这一步呢? –

+0

请参阅上面的答案 - 使用'reverseOrder'比较器的'Arrays.sort()'... – Betlista

2

我不知道你的用例是什么,但除了o这里的答案另一个(懒惰)选项仍然按照您指示的升序排序,但是然后在反向顺序中进行迭代。

31

另一种可能是(对数字!)

  1. -1
  2. 排序
  3. 乘再次与-1

字面上讲乘以阵列:

array = -Arrays.sort(-array) 
+16

'{__________ lol ________}' –

+7

这种方法实际上是创造性的,如果我们排序数字,即使它不是通用的,并且可能导致溢出问题... – hackjutsu

+2

这对于原始类型。你是天才。 –

42

没有明确的比较R:

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

具有明确比较:

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

的Java 8:

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

更新: reversed()逆转指定比较。通常,比较器按升序排列,所以这会改变顺序以降序。

2

首先,您需要使用排序的数组:

 Collections.sort(Myarray); 

然后,你需要从上升到下降的使用顺序颠倒:

 Collections.reverse(Myarray); 
2

另一个的解决方案是,如果你是利用可比较的接口,您可以切换您在compareTo(Object bCompared)中指定的输出值。

例如:

public int compareTo(freq arg0) 
{ 
    int ret=0; 
    if(this.magnitude>arg0.magnitude) 
     ret= 1; 
    else if (this.magnitude==arg0.magnitude) 
     ret= 0; 
    else if (this.magnitude<arg0.magnitude) 
     ret= -1; 
    return ret; 
} 

幅度是数据类型在我的计划双的属性。这是我的定义类频率以相反的顺序,它的大小。所以为了解决这个问题,你需要切换<>返回的值。这给你以下几点:

public int compareTo(freq arg0) 
{ 
    int ret=0; 
    if(this.magnitude>arg0.magnitude) 
     ret= -1; 
    else if (this.magnitude==arg0.magnitude) 
     ret= 0; 
    else if (this.magnitude<arg0.magnitude) 
     ret= 1; 
    return ret; 
} 

要使用该的compareTo的,我们只需调用Arrays.sort(mFreq),这将给你数组排序freq [] mFreq

这个解决方案的美观(在我看来)是它可以用来对用户定义的类进行排序,甚至比用特定属性对它们进行排序更多。如果一个Comparable接口的实现对你来说听起来令人生畏,我鼓励你不要这样想,实际上并不是这样。这link on how to implement comparable使我更容易。希望人们能够利用这个解决方案,并且你的喜悦甚至会被挖掘出来。

3
array.sort(function(a, b) {return b - a;}); //descending 

array.sort(function(a, b) {return a - b;}); //ascending 
0

我知道,这是一个相当古老的线程,但这里是整型的更新版本和Java 8:

Arrays.sort(array, (o1, o2) -> o2 - o1); 

请注意,这是“01 - o2“为正常升序(或Comparator.comparingInt())。

这也适用于任何其他类型的对象。说:

Arrays.sort(array, (o1, o2) -> o2.getValue() - o1.getValue());