개발일기/TIL(Since24.04.19)

Java Arrays.sort(arr, Comparator) 정리

w.llama 2025. 2. 4. 12:16

Arrays.sort()와 Comparator 개념

이전 글에서 Comparator에 대해 작성하였지만 추가적으로 작성하려고한다. Java에서 Arrays.sort(arr, Comparator)2차원 배열이나 사용자 정의 객체 배열을 정렬할 때 유용하게 사용하는데 기본적으로 TimSort 알고리즘을 기반으로 하며, 정렬 기준을 직접 설정할 수 있다.

Arrays.sort(arr) 기본 사용 (오름차순 정렬)

int[] arr = {5, 2, 8, 1, 3};
Arrays.sort(arr); // 결과: {1, 2, 3, 5, 8}

위 코드는 기본적으로 오름차순 정렬을 수행합니다.

2차원 배열 정렬 (Comparator 사용)

만약 2차원 배열이 있을 때 특정한 기준(예: 첫 번째 열 기준 또는 두 번째 열 기준)으로 정렬하고 싶다면, Comparator를 사용해야됨

Arrays.sort() + Comparator를 활용한 2차원 배열 정렬

기본 예제 (2차원 배열 오름차순 정렬)

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[][] arr = {
            {3, 4},
            {1, 1},
            {1, -1},
            {2, 2},
            {3, 3}
        };

        // 첫 번째 열(인덱스 0) 기준 오름차순 정렬
        Arrays.sort(arr, (e1, e2) -> {
            return e1[0] - e2[0];
        });

        // 결과 출력
        for (int[] row : arr) {
            System.out.println(Arrays.toString(row));
        }
    }
}
//실행 결과
[1, 1]
[1, -1]
[2, 2]
[3, 4]
[3, 3]
  • e1[0] - e2[0] → 첫 번째 열을 기준으로 오름차순 정렬됨
  • 하지만 1,11,-1의 순서가 원하는 대로 정렬되지 않음 (동일한 Y 값일 때 X 값 기준으로 정렬 필요!)

Y 좌표 오름차순 → Y가 같으면 X 좌표 오름차순 정렬

Arrays.sort(arr, (e1, e2) -> {
    if (e1[0] == e2[0]) {
        return e1[1] - e2[1];  // X 좌표 기준 정렬
    } else {
        return e1[0] - e2[0];  // Y 좌표 기준 정렬
    }
});

e1e2의 역할 (중요!! 이해를 꼭 해야 된다 )

  • e1e2는 각각 arr 배열의 두 개의 행(row) 을 의미합니다.
    (기본 예제에서 e1 = {3,4} 이고 e2 = {1,1}이다. 정렬이 진행되면서 e1과 e2는 새로운 비교 대상이 되어 계속 변경된다. 즉, 배열이 정렬될 때마다 e1과 e2는 현재 정렬 상태에서 새롭게 선택되는 요소가 된다.)
  • 즉, e1 = arr[i], e2 = arr[j] (서로 다른 두 행을 비교함)
  • e1[0]e1 행의 첫 번째 값 (예: Y 좌표)
  • e1[1]e1 행의 두 번째 값 (예: X 좌표)

동작 방식

비교 요소 결과
e1[0] == e2[0] (Y 좌표 같음) X 좌표 기준 오름차순 정렬 (return e1[1] - e2[1])
e1[0] != e2[0] (Y 좌표 다름) Y 좌표 기준 오름차순 정렬 (return e1[0] - e2[0])
// 실행 결과
[1, -1]
[1, 1]
[2, 2]
[3, 3]
[3, 4]
  • Y 좌표(첫 번째 원소)를 기준으로 오름차순 정렬
  • Y 좌표가 동일하면, X 좌표(두 번째 원소) 기준으로 오름차순 정렬

Comparator을 활용한 내림차순 정렬

* 내림차순 정렬을 원한다면 비교 연산자를 반대로 설정하면 됩니다.

Y 기준 내림차순 → Y가 같다면 X 기준 내림차순

Arrays.sort(arr, (e1, e2) -> {
    if (e1[0] == e2[0]) {
        return e2[1] - e1[1];  // X 기준 내림차순
    } else {
        return e2[0] - e1[0];  // Y 기준 내림차순
    }
});
// 실행 결과
[3, 4]
[3, 3]
[2, 2]
[1, 1]
[1, -1]

Comparator을 사용한 정렬 응용

Comparator를 별도 클래스로 정의하기

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

class CustomComparator implements Comparator<int[]> {
    @Override
    public int compare(int[] e1, int[] e2) {
        if (e1[0] == e2[0]) {
            return e1[1] - e2[1];
        } else {
            return e1[0] - e2[0];
        }
    }
}

public class Main {
    public static void main(String[] args) {
        int[][] arr = {
            {3, 4}, {1, 1}, {1, -1}, {2, 2}, {3, 3}
        };

        Arrays.sort(arr, new CustomComparator());

        for (int[] row : arr) {
            System.out.println(Arrays.toString(row));
        }
    }
}
// 실행결과
[1, -1]
[1, 1]
[2, 2]
[3, 3]
[3, 4]

장점

  • Comparator 클래스를 따로 만들어 재사용 가능
  • 코드가 길어질 경우 가독성이 향상됨

결론

  • Arrays.sort(arr, Comparator)는 2차원 배열 정렬 시 매우 유용함
  • Y 기준 정렬 후 X 정렬과 같은 복잡한 정렬 조건도 람다식으로 간단하게 구현 가능
  • 내림차순 정렬 시 e2 - e1 방식으로 조정하면 됨
  • 별도 Comparator 클래스를 정의하면 코드 재사용성이 높아짐