Java/개념정리

[Java] 배열 정렬하기 (Arrays.sort(), Collections.reverseOrder() 사용)

Sehyeok20 2023. 10. 30. 13:07
반응형

Arrays.sort()

 

자바에서 배열이나 리스트를 정렬하고 싶을 때 java.util.Arrays 클래스의 sort() 메서드를 사용하면 따로 정렬 알고리즘을 짜지 않고도 한번의 메소드 호출로 간편하게 배열이나 리스트를 정렬할 수 있다. 

Arrays클래스는 배열의 복사, 항목 정렬, 검색과 같은 배열을 조작하는 기능을 가지고 있다. 

 

 

Arrays.sort(배열);

위와 같이 괄호안에 정렬할 대상이 되는 배열을 넣어주기만 하면 돼서 매우 간편하다.

이는 int형, String형 모두 오름차순 정렬에 사용할 수 있다.

 

그렇다면 내림차순 정렬은 어떻게 하면 될까?

Arrays.sort() 메소드를 이용해 오름차순으로 정렬해놓았으니, 이를 역순으로 보여준다면 간단히 해결 할 수 있다.

 

// 해설참조 : sehyeok.tistory.com 

import java.io.IOException;
import java.util.Arrays;

public class Main {
    public static void main(String args[]) throws IOException {
        int num[] = { 10, 25, 42, 23, 51, 19, 34, 44 }; // 숫자 배열
        String fruit[] = { "apple", "orange", "banana", "grape", "peach", "melon" }; // 문자열 배열
        Arrays.sort(num); // 숫자 배열 정렬
        Arrays.sort(fruit); // 문자열 배열 정렬

        for (int i : num) { // 숫자 오름차순 정렬
            System.out.print(i + " ");
        }
        System.out.println("");

        for (String i : fruit) { // 문자열 오름차순 정렬
            System.out.print(i + " ");
        }
        System.out.println("");

        for (int i = num.length - 1; i >= 0; i--) { // 숫자 내림차순 정렬
            System.out.print(num[i] + " ");
        }
        System.out.println("");

        for (int i = fruit.length - 1; i >= 0; i--) { // 문자열 내림차순 정렬
            System.out.print(fruit[i] + " ");
        }
    }

}

결과

위와 같이 for문을 이용해서 역순으로 출력한다면 내림차순도 간단히 해결 할 수 있다.

 

다만, 좀 더 간편히 내림차순으로 정렬된 배열을 얻을 수 있는 방법이 있다.

 

 

Collections.reverseOrder()

 

Collections.reverseOrder() 메소드를 이용하면 역순으로 정렬된 배열을 얻을 수 있다.

Arrays.sort(배열, Collections.reverseOrder());

사용법도 간단한데, Arrays.sort() 메소드의 두번째 파라미터로 이 메소드를 넣어주면 된다.

 

다만 이 때 주의할 점이 있는데,

Collections.reverseOrder()으로 정렬할 배열은 프리미티브 타입이 아닌 래퍼클래스 이어야 한다는 점이다.

Collections는 Object를 상속한 클래스에 대해서 사용 가능한 인터페이스이므로,

String, Integer, Double 등과 같은 Object 타입의 배열은 Collections.reverseOrder() 사용이 가능하고,

프리미티브 타입인 int, double, char, float 등은 사용이 불가하다.

 

때문에 프리미티브 타입의 배열을 Object를 상속하는 Wrapper 클래스로 박싱해주어야 역순정렬도 가능하다.

출처 : https://bangu4.tistory.com/287

 

// 해설참조 : sehyeok.tistory.com 

import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;

public class Main {
    public static void main(String args[]) throws IOException {
        int num[] = { 10, 25, 42, 23, 51, 19, 34, 44 }; // 숫자 배열 (프리미티브 타입)
        String fruit[] = { "apple", "orange", "banana", "grape", "peach", "melon" }; // 문자열 배열

        Arrays.sort(num); // 숫자 배열 정렬
        Arrays.sort(fruit); // 문자열 배열 정렬

	Arrays.sort(num, Collections.reverseOrder()); // 숫자 배열 역순 정렬 -> 오류 발생
        
        Integer[] tmp = Arrays.stream(num).boxed().toArray(Integer[]::new); // 프리미티브 타입 배열을 래퍼클래스로 박싱

        Arrays.sort(tmp, Collections.reverseOrder()); // 숫자 배열 역순 정렬
        Arrays.sort(fruit, Collections.reverseOrder()); // 문자열 배열 역순 정렬

        for (int i : tmp) { // 숫자 배열 순서대로 출력
            System.out.print(i + " ");
        }
        System.out.println("");

        for (String i : fruit) { // 문자열 배열 순서대로 출력
            System.out.print(i + " ");
        }
        System.out.println("");
    }
}

결과

숫자 배열 num 과 문자열 배열 fruit 를 역순 정렬한 결과이다.

num배열은 int형으로 선언되어 있으므로 이대로 Collections.reverseOrder()를 사용한다면 에러가 발생한다.

때문에 Integer[] tmp = Arrays.stream(num).boxed().toArray(Integer[]::new) 과정을 통해 tmp라는 Integer타입의 배열에 int형 배열인 num을 Integer타입으로 박싱해주는 과정을 거친 후, tmp배열을 Collections.reverseOrder()를 이용해 sort하면 정상적인 결과를 얻을 수 있다.

반응형