Java数组排序降序?


Answers:


330

您可以使用它对各种对象进行排序

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

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

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

找不到适合sort(int [],comparator)的方法

可以与“对象数组”(例如Integer数组)一起使用,但不适用于基本数组(例如int数组)。

按降序对原始数组进行排序的唯一方法是,首先按升序对数组进行排序,然后将数组反转就位。对于二维基本数组也是如此。


115
它不能对基元数组进行排序
Masood_mj 2012年

14
将您的基本体转换为它们各自的对象。整数表示整数,双精度表示双精度,布尔表示布尔型,等等
Ishmael 2013年

12
如果您仍然想使用自定义比较器Collections.reverseOrder(this)
Sebastian Hojas 2013年

Collections.reverseOrder()不带任何参数(除非我遗漏了什么?),而是使用了myComparator.reversed()。
jsaven

1
Arrays.sort()不能直接用于按降序对原始数组进行排序。如果尝试通过传递由Collection.reverseOrder()定义的反向Comparator来调用Arrays.sort()方法,则会抛出错误-“找不到适合sort(int [],comparator <object>)的方法”在Integer数组上可以正常工作,但在int数组上不能工作。按降序对原始数组进行排序的唯一方法是,首先按升序对数组进行排序,然后将数组反转就位。对于二维基本数组也是如此。
akuriako '18

96

清单

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

用于数组

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

25
int [] array = {2,4,3,6,8,7}; Arrays.sort(array,Collections.reverseOrder()); 给我一个错误!错误是:“数组类型中的方法sort(int [])不适用于参数(int [],Comparator <Object>)”
Dixit Singla 2014年

8
int不是对象。尝试改用Integer []。
Ornithopter 2014年

6
int是主要类型,而Integer不是。这就是为什么Integer具有诸如parse,toString等方法的原因
Ornithopter 2015年

91

您可以使用此:

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

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


8
OP希望对数组进行排序。Collections.sort()接受一个List输入参数,而不是一个数组。
Pascal Thivent 09年

61

另一种可能是(用于数字!!!)

  1. 将数组乘以-1
  2. 分类
  3. 再次乘以-1

从字面上讲:

array = -Arrays.sort(-array)

7
即使我们对数字进行排序,这种方法实际上也是有创意的,即使它不是通用的,也可能导致溢出问题...
hackjutsu

3
对于原始类型,这是一个很好的答案。你真是天才
HalilİbrahimOymacı16年

2
不同之处在于它会失败Integer.MIN_VALUE(或者无论使用哪种原语)。最好使用sort(),然后再使用reverse(),但是您必须自己进行反转,因为它们没有添加Arrays.reverse()实现。
Andreas

1
@Halil易卜拉欣Oymacı:-array语法不工作对我来说:“不好操作类型为int []的一元运算符‘ - ’”

8
@line您必须乘以-1才能数组。上面的代码是伪代码。您可以在for循环中将-1乘以数组,然后调用Array.sort()方法,最后再次将-1乘以Array。
HalilİbrahimOymacı17年

47

没有显式比较器:

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

使用显式比较器:

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

10

Java 8:

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

更新: reversed()反转指定的比较器。通常,比较器的顺序为升序,因此这会将顺序更改为降序。


1
它可以完美地与对象一起使用,但不能与基元一起使用。对于原语int排序,应按ASC顺序排序,然后反转答案。
罗素(Russell Sk)。

5

对于包含基元元素的数组,如果org.apache.commons.lang(3)可以使用的话,可以使用简单的方法来反转数组(排序后):

ArrayUtils.reverse(array);

1
如果可以一步完成,为什么要先按升序排序,然后使用外部库还原此顺序?
Betlista 2014年

那一步是吗?
Josip Maslac 2014年

5
是的,但是(如这些答案的注释中所述)对我的答案所针对的原语不起作用。当然,我的答案当然不是最佳答案,但我发现它符合原始作者强调的“简单”标准-即。Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Josip Maslac 2014年

5

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

Collections.sort(Myarray);

然后,您需要使用以下命令将顺序从升序转换为降序:

Collections.reverse(Myarray);

4

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


4

int[] arr = {1, 2, 3};使用Arrays.sort()和不能直接对基元数组(即)进行反向排序,Collections.reverseOrder()因为这些方法需要引用类型(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]

3

另一个解决方案是,如果您使用Comparable接口,则可以切换在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;
}

其中,振幅是我程序中数据类型为double的属性。这是按照其大小按相反的顺序对我定义的类频率进行排序。因此,为了更正此问题,请切换由<和返回的值>。这给您以下内容:

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接口对您来说令人生畏,我鼓励您不要这样,实际上不是。这对如何实现可比的链接使事情对我来说要容易得多。希望人们可以使用此解决方案,并且您的喜悦甚至可以我的喜悦相提并论



0

我知道这是一个很旧的线程,但是这里是Integers和Java 8的更新版本:

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

请注意,对于正常的升序(或Comparator.comparingInt()),它是“ o1-o2”。

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

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

1
这仅适用于引用类型数组,不适用于基本类型的数组。
kimbaudi

0

这为我工作:

package doublearraysort;

import java.util.Arrays;
import java.util.Collections;

public class Gpa {


    public static void main(String[] args) {
        // initializing unsorted double array
        Double[] dArr = new Double[] {                 
            new Double(3.2),
            new Double(1.2),
            new Double(4.7),
            new Double(3.3),
            new Double(4.6),
           };
        // print all the elements available in list
        for (double number : dArr) {
            System.out.println("GPA = " + number);
        }

        // sorting the array
        Arrays.sort(dArr, Collections.reverseOrder());

        // print all the elements available in list again
        System.out.println("The sorted GPA Scores are:");
        for (double number : dArr) {
            System.out.println("GPA = " + number);
        }
    }
}

输出:

GPA = 3.2
GPA = 1.2
GPA = 4.7
GPA = 3.3
GPA = 4.6
The sorted GPA Scores are:
GPA = 4.7
GPA = 4.6
GPA = 3.3
GPA = 3.2
GPA = 1.2

0
public double[] sortArrayAlgorithm(double[] array) { //sort in descending order
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array.length; j++) {
            if (array[i] >= array[j]) {
                double x = array[i];
                array[i] = array[j];
                array[j] = x;
            }
        }
    }
    return array;
}

只需使用此方法以降序对double类型的数组进行排序,就可以通过更改“返回类型”,“自变量类型”和“返回类型”来对其他类型(例如int,float等)的数组进行排序将变量“ x”类型转换为相应的类型。您还可以在if条件中将“> =”更改为“ <=”以使顺序升序。


0

您可以将操作(Collections.stream())与Comparator.reverseOrder()一起使用

例如,假设您有以下集合:

List<String> items = new ArrayList<>();
items.add("item01");
items.add("item02");
items.add("item03");
items.add("item04");
items.add("item04");

要以“自然”顺序打印项目,可以使用sorted()方法(或将其省略并获得相同的结果):

items.stream()
     .sorted()
     .forEach(item -> System.out.println(item));

或以降序(反向)打印它们,可以使用采用Comparator并颠倒顺序的已排序方法:

items.stream()
     .sorted(Comparator.reverseOrder())
     .forEach(item -> System.out.println(item));

请注意,这要求集合已实现Comparable(Integer,String等)。


0

这里发生了很多混乱-人们建议非原始值的解决方案,尝试从地面实施一些排序算法,提供涉及其他库的解决方案,展示一些骇客的库等。原始问题的答案是50 / 50。对于那些只想复制/粘贴的人:

// our initial int[] array containing primitives
int[] arrOfPrimitives = new int[]{1,2,3,4,5,6};

// we have to convert it into array of Objects, using java's boxing
Integer[] arrOfObjects = new Integer[arrOfPrimitives.length];
for (int i = 0; i < arrOfPrimitives.length; i++) 
    arrOfObjects[i] = new Integer(arrOfPrimitives[i]);

// now when we have an array of Objects we can use that nice built-in method
Arrays.sort(arrOfObjects, Collections.reverseOrder());

arrOfObjects{6,5,4,3,2,1}现在。如果您的数组不是整数,则使用相应的对象代替Integer


0

对于上面的讨论,这是一个简单的示例,以降序对基本数组进行排序。

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] nums = { 5, 4, 1, 2, 9, 7, 3, 8, 6, 0 };
        Arrays.sort(nums);

        // reverse the array, just like dumping the array!
        // swap(1st, 1st-last) <= 1st: 0, 1st-last: nums.length - 1
        // swap(2nd, 2nd-last) <= 2nd: i++,  2nd-last: j--
        // swap(3rd, 3rd-last) <= 3rd: i++,  3rd-last: j--
        //
        for (int i = 0, j = nums.length - 1, tmp; i < j; i++, j--) {
            tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }

        // dump the array (for Java 4/5/6/7/8/9)
        for (int i = 0; i < nums.length; i++) {
            System.out.println("nums[" + i + "] = " + nums[i]);
        }
    }
}

输出:

nums[0] = 9
nums[1] = 8
nums[2] = 7
nums[3] = 6
nums[4] = 5
nums[5] = 4
nums[6] = 3
nums[7] = 2
nums[8] = 1
nums[9] = 0

0

简单的方法将一个int数组降序排序:

private static int[] descendingArray(int[] array) {
    Arrays.sort(array);
    int[] descArray = new int[array.length];
    for(int i=0; i<array.length; i++) {
        descArray[i] = array[(array.length-1)-i];
    }
    return descArray;
}

-1

比较器的另一种方法

import java.util.Arrays;
import java.util.Comparator;
...

Integer[] aInt = {6,2,3,4,1,5,7,8,9,10};
Arrays.sort(aInt, Comparator.reverseOrder()  );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.