자바 배열 정렬 내림차순?


답변:


330

이것을 사용하여 모든 종류의 객체를 정렬 할 수 있습니다

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

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

Arrays.sort()기본 배열을 내림차순으로 정렬하는 데 직접 사용할 수 없습니다. 에 Arrays.sort()의해 정의 된 역 비교기를 전달 하여 메소드 를 호출하려고 Collections.reverseOrder()하면 오류가 발생합니다.

sort (int [], comparator)에 적합한 메소드가 없습니다.

Integer 배열과 같은 'Array of Objects'에서는 제대로 작동하지만 int 배열과 같은 기본 배열에서는 작동하지 않습니다.

기본 배열을 내림차순으로 정렬하는 유일한 방법은 먼저 배열을 오름차순으로 정렬 한 다음 배열을 제자리로 뒤집는 것입니다. 이것은 2 차원 프리미티브 배열에도 적용됩니다.


115
프리미티브 배열을 정렬 할 수 없음
Masood_mj

14
기본 요소를 해당 오브젝트로 변환하십시오. int에 대한 정수, double에 대한 더블, 부울에 대한 부울 등
Ishmael

12
여전히 커스텀 비교기 를 사용하려면 :Collections.reverseOrder(this)
Sebastian Hojas

Collections.reverseOrder ()는 매개 변수를 사용하지 않고 (내가 뭔가 빠진 것이 아니라면) 대신 myComparator.reversed ()를 사용했습니다.
jsaven

1
기본 배열을 내림차순으로 정렬하는 데 Arrays.sort ()를 직접 사용할 수 없습니다. Collection.reverseOrder ()에 의해 정의 된 역 Comparator를 전달하여 Arrays.sort () 메소드를 호출하려고하면 "sort (int [], comparator <object>)에 적합한 메소드를 찾을 수 없습니다"라는 오류가 발생합니다. Integer 배열에서는 잘 작동하지만 int 배열에서는 작동하지 않습니다. 기본 배열을 내림차순으로 정렬하는 유일한 방법은 먼저 배열을 오름차순으로 정렬 한 다음 배열을 제자리로 뒤집는 것입니다. 이것은 2 차원 프리미티브 배열에도 적용됩니다.
akuriako

96

목록을 위해

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

배열

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

25
int [] 배열 = {2,4,3,6,8,7}; Arrays.sort (배열, Collections.reverseOrder ()); 나에게 오류를주고있다! 오류 : "배열 형식의 sort (int []) 메소드는 인수 (int [], Comparator <Object>)에 적용 할 수 없습니다"
Dixit Singla

8
int는 Object가 아닙니다. 대신 Integer []를 사용해보십시오.
Ornithopter

6
int는 기본 유형이지만 Integer는 그렇지 않습니다. 이것이 Integer에 구문 분석, toString 등의 메소드가있는 이유입니다.
Ornithopter

91

이것을 사용할 수 있습니다 :

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

Collections.reverseOrder()Comparator역 자연 순서를 사용하여를 반환합니다 . 를 사용하여 자신의 비교기의 역 버전을 얻을 수 있습니다 Collections.reverseOrder(myComparator).


8
OP는 배열을 정렬하려고합니다. Collections.sort()얻어 List입력 파라미터 아닌 배열로.
Pascal Thivent

61

대안이 될 수 있습니다 (숫자 !!!)

  1. 배열에 -1을 곱합니다
  2. 종류
  3. -1로 다시 한번 곱하십시오

말 그대로 :

array = -Arrays.sort(-array)

7
이 방법은 일반적이지 않고 오버플로에 문제를 일으킬 수 있지만 숫자를 정렬하는 경우 실제로 창의적입니다.
hackjutsu

3
이것은 기본 유형에 대한 좋은 대답입니다. 당신은 천재입니다.
Halil İbrahim Oymacı

2
는 것이다 것을 제외하고 실패 에 대한 Integer.MIN_VALUE(또는 사용되는 원시적 중). 더 나을 수 있습니다 sort()다음, reverse()그들은 추가하지 않았기 때문에,하지만 당신은 자신을 반대해야 할 것이다 Arrays.reverse()구현.
Andreas

1
@Halil İbrahim Oymacı : -array 구문이 작동하지 않습니다 : "단항 연산자 '-'에 대한 잘못된 피연산자 유형 int []"
Line

8
@line 배열하려면 -1을 여러 개 사용해야합니다. 위의 코드는 의사 코드입니다. for 루프에서 -1을 여러 개 배열 한 다음 Array.sort () 메서드를 호출하여 마지막으로 다시 -1을 여러 개 배열 할 수 있습니다.
Halil İbrahim Oymacı

47

명시 적 비교기가없는 경우 :

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

명시 적 비교기 :

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

10

자바 8 :

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

업데이트 : reversed()지정된 비교기를 되돌립니다. 일반적으로 비교기는 오름차순으로 정렬되므로 순서가 내림차순으로 바뀝니다.


1
프리미티브가 아닌 Objects와 완벽하게 작동합니다. sort primitive int의 경우 ASC 순서로 정렬 한 다음 답을 바꾸어야합니다.
Russell Sk.

5

프리미티브 요소를 포함하는 배열의 경우 org.apache.commons.lang(3)(정렬 후) 배열을 쉽게 되돌릴 수있는 쉬운 방법 이 있다면 다음 을 사용하는 것입니다.

ArrayUtils.reverse(array);

1
한 단계에서 수행 할 수있을 때 먼저 오름차순으로 정렬 한 다음 외부 라이브러리를 사용 하여이 순서를 되 돌리는 이유는 무엇입니까?
Betlista

그리고 그 단계는?
Josip Maslac

5
그렇습니다 (내 답변에 대한 의견에 명시된 바와 같이). 내 대답이 다루는 기본 요소에는 작동하지 않습니다. 물론 내 대답은 확실히 최적의 대답은 아니지만 원저자가 강조한 "쉬운"기준을 충족하는 것으로 나타났습니다. Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Josip Maslac

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 인 속성입니다 . 이것은 정의 된 클래스 freq 를 크기별로 역순 으로 정렬 했습니다. 이를 정정하기 위해 <and에서 리턴 한 값을 전환하십시오 >. 이것은 당신에게 다음을 제공합니다 :

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 인터페이스의 구현이 귀찮게 들린다면 그렇게 생각하지 않는 것이 좋습니다. 실제로는 그렇지 않습니다. 비교 가능한 구현 방법에 대한링크를 통해 훨씬 쉽게 작업 할 수있었습니다. 희망하는 사람들이이 솔루션을 이용할 수 있으며, 당신의 기쁨도 내 것과 비슷할 것입니다.


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

또는

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

5
Java 질문과 어떤 관련이 있습니까?
Dmitry Ginzburg

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 유형의 배열을 내림차순으로 정렬하고, "return type", "argument type"및 변수 "x"유형을 해당 유형으로 if 조건에서 주문을 오름차순으로 만들기 위해 "> ="를 "<="로 변경할 수도 있습니다.


0

Comparator.reverseOrder () 와 함께 스트림 작업 ( Collections.stream () )을 사용할 수 있습니다 .

예를 들어이 컬렉션이 있다고 가정 해 봅시다.

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을 구현해야합니다 (정수, 문자열 등).


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}지금. int 이외의 배열이있는 경우 대신 해당 객체 를 사용하십시오 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;
}

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

출처


-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()  );
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.