자바 배열 정렬 내림차순?


답변:


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.