Comparator

JayJi·2026년 4월 8일

알고리즘

목록 보기
9/30

관련 문제

문제난이도핵심
1181번 — 단어 정렬실버 V다중 조건 정렬
11650번 — 좌표 정렬하기실버 V2차원 좌표 정렬
11651번 — 좌표 정렬하기 2실버 Vy 기준 정렬
10814번 — 나이순 정렬실버 V안정 정렬
1946번 — 신입 사원실버 I정렬 + 그리디
2751번 — 수 정렬하기 2실버 V기본 정렬

1. Comparator란?

Java에서 객체를 원하는 기준으로 정렬할 때 사용하는 인터페이스다.
기본 Arrays.sort()는 오름차순만 지원하지만, Comparator를 사용하면 어떤 기준으로든 정렬할 수 있다.


2. 반환값 규칙

Comparator의 핵심은 compare(o1, o2)의 반환값이다.

반환값의미결과
음수o1이 o2보다 앞o1 → o2 순서 유지
0o1과 o2 동일순서 변경 없음
양수o1이 o2보다 뒤o2 → o1 순서로 바뀜
// o1 - o2 → 오름차순
// o2 - o1 → 내림차순

3. 기본 사용법

배열 정렬 — 내림차순

Integer[] arr = {3, 1, 4, 1, 5, 9};

Arrays.sort(arr, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2 - o1;  // 내림차순
    }
});

람다식으로 축약

Arrays.sort(arr, (o1, o2) -> o2 - o1);  // 내림차순

4. 자주 쓰이는 패턴

패턴 1 — 단순 오름차순 / 내림차순

// 오름차순 (기본값과 동일)
Arrays.sort(arr, (o1, o2) -> o1 - o2);

// 내림차순
Arrays.sort(arr, (o1, o2) -> o2 - o1);

패턴 2 — 문자열 길이 기준 정렬

String[] words = {"banana", "apple", "kiwi"};

Arrays.sort(words, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.length() - o2.length();  // 길이 오름차순
    }
});

패턴 3 — 다중 조건 정렬 (길이 → 사전순)

// 1181번 단어 정렬 핵심 패턴
Arrays.sort(words, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        if (o1.length() != o2.length()) {
            return o1.length() - o2.length();  // 1차: 길이 오름차순
        }
        return o1.compareTo(o2);               // 2차: 사전순
    }
});

패턴 4 — 2차원 배열 정렬 (x 기준 → y 기준)

// 11650번 좌표 정렬하기 핵심 패턴
int[][] points = {{3, 4}, {1, 2}, {1, 5}};

Arrays.sort(points, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        if (o1[0] != o2[0]) {
            return o1[0] - o2[0];  // 1차: x 오름차순
        }
        return o1[1] - o2[1];      // 2차: y 오름차순
    }
});

패턴 5 — List 정렬

List<Integer> list = new ArrayList<>(Arrays.asList(3, 1, 4, 1, 5));

list.sort(new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1 - o2;  // 오름차순
    }
});

// Collections.sort도 동일
Collections.sort(list, (o1, o2) -> o1 - o2);

5. 주의사항

오버플로우 주의

값의 범위가 클 때 o1 - o2 방식은 오버플로우가 발생할 수 있다.

// 위험 — 값이 클 때 오버플로우 가능
return o1 - o2;

// 안전 — Integer.compare 사용
return Integer.compare(o1, o2);

int 배열은 Comparator 직접 사용 불가

int[]는 기본형이라 Comparator를 바로 사용할 수 없다. Integer[]로 선언하거나 2차원 배열을 사용해야 한다.

// 불가
int[] arr = {3, 1, 4};
Arrays.sort(arr, (o1, o2) -> o2 - o1);  // 컴파일 에러

// 가능
Integer[] arr = {3, 1, 4};
Arrays.sort(arr, (o1, o2) -> o2 - o1);

6. Comparator vs Comparable

ComparatorComparable
위치외부 클래스에 정의정렬 대상 클래스 내부에 정의
메서드compare(o1, o2)compareTo(o)
기준 수여러 기준 가능하나의 기준만
코테 활용자주 사용가끔 사용

코테에서는 대부분 Comparator를 사용한다.

profile
Java와 SpringBoot를 이용한 백엔드 개발자가 되려고 합니다.

0개의 댓글