Java数组排序下降?

时间:2009-11-07 23:05:07

标签: java arrays sorting int

是否有任何简单的方法按降序对数组进行排序,就像它们在Arrays class中按升序排序一样?

或者我必须停止懒惰并自己这样做:[

25 个答案:

答案 0 :(得分:290)

您可以使用它来对所有类型的对象进行排序

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

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

Arrays.sort()不能直接用于按降序对基本数组进行排序。如果您尝试通过传递Arrays.sort()定义的反向比较器来调用Collection.reverseOrder()方法,则会抛出错误

  

没有为sort(int [],比较器)找到合适的方法

这对于Integer数组可以正常工作,但不适用于int数组。

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

答案 1 :(得分:90)

您可以使用:

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

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

答案 2 :(得分:86)

列表

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

表示数组

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

答案 3 :(得分:49)

替代方案可以是(对于数字!!!)

  1. 将数组乘以-1
  2. 排序
  3. 再次乘以-1
  4. 直译:

    array = -Arrays.sort(-array)
    

答案 4 :(得分:46)

没有明确的比较器:

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

使用明确的比较器:

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

答案 5 :(得分:7)

Java 8:

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

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

答案 6 :(得分:4)

对于包含基元元素的数组,如果有org.apache.commons.lang(3)处理,则可以使用反向数组(排序后):

ArrayUtils.reverse(array);

答案 7 :(得分:4)

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

Collections.sort(Myarray);

然后你需要使用以下方法将顺序从升序转换为降序

Collections.reverse(Myarray);

答案 8 :(得分:3)

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

答案 9 :(得分:3)

另一个解决方案是,如果您正在使用 Comparable 接口,则可以切换您在compareTo中指定的输出值(对象b比较)

例如:

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 的属性。这是按照它的大小以相反的顺序对我定义的类 freq 进行排序。因此,为了纠正错误,您可以切换<>返回的值。这为您提供了以下内容:

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

这个解决方案的美丽(在我看来)是它可以用来对用户定义的类进行排序,甚至可以用特定的属性对它们进行排序。如果实施可比较的界面听起来令人生畏,我鼓励你不要那么想,它实际上并不是。这link on how to implement comparable使我的事情变得更加容易。希望人们可以使用这个解决方案,并且你的喜悦甚至可以与我的相似。

答案 10 :(得分:2)

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

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

答案 11 :(得分:1)

对于按降序排序的二维数组,您只需翻转参数的位置

int[][] array= {
    {1, 5},
    {13, 1},
    {12, 100},
    {12, 85} 
};
Arrays.sort(array, (a, b) -> Integer.compare(a[1], b[1])); // for ascending order
Arrays.sort(array, (b, a) -> Integer.compare(a[1], b[1])); // for descending order

降序输出

12, 100
12, 85
1, 5
13, 1

答案 12 :(得分:1)

当数组是 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();

答案 13 :(得分: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条件中将“&gt; =”更改为“&lt; =”以使订单升序。

答案 14 :(得分:0)

您可以对stream使用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));

或者以降序(反向)打印它们,可以使用采用比较器并颠倒顺序的sorted方法:

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

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

答案 15 :(得分:0)

不可能直接使用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]

答案 16 :(得分:0)

这里发生了很多混乱-人们建议非原始值的解决方案,尝试从地面实施一些排序算法,提供涉及其他库的解决方案,展示一些hacky库等。问题是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}。如果您的数组不是整数,请使用相应的object而不是Integer

答案 17 :(得分: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

答案 18 :(得分: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;
}

答案 19 :(得分:0)

有时候我们通过一个例子来练习是很好的,这里有一个完整的例子:

sortdesc.java

import java.util.Arrays;
import java.util.Collections;
class sortdesc{
public static void main(String[] args){
       // int Array
       Integer[] intArray=new Integer[]{
                 new Integer(15),
                 new Integer(9),
                 new Integer(16),
                 new Integer(2),
                 new Integer(30)};

       // Sorting int Array in descending order
       Arrays.sort(intArray,Collections.reverseOrder());

       // Displaying elements of int Array
       System.out.println("Int Array Elements in reverse order:");
       for(int i=0;i<intArray.length;i++)
          System.out.println(intArray[i]);

       // String Array
       String[] stringArray=new String[]{"FF","PP","AA","OO","DD"};

       // Sorting String Array in descending order
       Arrays.sort(stringArray,Collections.reverseOrder());

       // Displaying elements of String Array
       System.out.println("String Array Elements in reverse order:");
       for(int i=0;i<stringArray.length;i++)
          System.out.println(stringArray[i]);}}

正在编译...

javac sortdec.java

调用它...

java sortdesc

输出

Int Array Elements in reverse order:
30
16
15
9
2
String Array Elements in reverse order:
PP
OO
FF
DD
AA

如果您想尝试字母数字数组...

//replace this line:
String[] stringArray=new String[]{"FF","PP","AA","OO","DD"};

//with this:
String[] stringArray=new String[]{"10FF","20AA","50AA"};

您将获得如下输出:

50AA
20AA
10FF

source

答案 20 :(得分:0)

有一种方法可能会更长一些,但是效果很好。这是一种将int数组降序排序的方法。

希望这会在某天对某人有所帮助:

public static int[] sortArray (int[] array) {
    int [] sortedArray = new int[array.length];
    for (int i = 0; i < sortedArray.length; i++) {
        sortedArray[i] = array[i];
    }
    
    boolean flag = true;
    int temp;
    while (flag) {
        flag = false;
        for (int i = 0; i < sortedArray.length - 1; i++) {
            if(sortedArray[i] < sortedArray[i+1]) {
                temp = sortedArray[i];
                sortedArray[i] = sortedArray[i+1];
                sortedArray[i+1] = temp;
                flag = true;
            }
        }
    }
    
    return sortedArray;
    
}

答案 21 :(得分:0)

我有以下工作解决方案

    public static int[] sortArrayDesc(int[] intArray){
    Arrays.sort(intArray);                      //sort intArray in Asc order
    int[] sortedArray = new int[intArray.length];   //this array will hold the sorted values

    int indexSortedArray = 0;
    for(int i=intArray.length-1 ; i >= 0 ; i--){    //insert to sortedArray in reverse order
        sortedArray[indexSortedArray ++] = intArray [i];
    }
    return sortedArray;
}

答案 22 :(得分:0)

这对我有用:

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

my_map = Basemap(projection = 'ortho', lat_0=50, lon_0=-100,
                resolution = 'l', area_thresh=1000.0)

my_map.drawcoastlines()
my_map.drawcountries()
my_map.fillcontinents(color='red')

plt.show()

输出:

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);
        }
    }
}

答案 23 :(得分:0)

我知道这是一个非常古老的线程,但这里是Integers和Java 8的更新版本:

              AuthorizationScope[] authorizationScopes
              List<AuthorizationScope> authorizationScopeList 

请注意,它是&#34; o1 - o2&#34;对于正常的升序(或Comparator.comparingInt())。

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

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

答案 24 :(得分:-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()  );