Skip to main content

[Java] Comparator 내림차순 정렬 할 때 주의사항


예시코드

import java.util.*;

class Solution {
    public int solution(int[] rank, boolean[] attendance) {
        List<Integer> candidates = new ArrayList<>();
        
        for (int i = 0; i < attendance.length; i++) {
            if (attendance[i]) {
                candidates.add(i); // 참가 가능한 학생의 번호(index) 저장하기
            }
        }
        
        // 학생 번호 리스트를 rank 기준으로 정렬하기
        candidates.sort(Comparator.comparingInt(i -> rank[i]));
        
        int a = candidates.get(0); // 가장 높은 순위
        int b = candidates.get(1);
        int c = candidates.get(2);
        
        return 10000 * a + 100 * b + c;
    }
}

candidates를 rank[i] 기준으로 오름차순 정렬

  • 학생 번호 리스트 candidates를 rank[i] 값 기준으로 오름차순 정렬
  • rank[i]가 작은 순서대로 → 1등. 2등, 3등...
candidates.sort(Comparator.comparingInt(i -> rank[i]));

candidates를 rank[i] 기준으로 내림차순 정렬

candidates.sort(Comparator.comparingInt((Integer i) -> rank[i]).reversed());
  • 만약 내림차순으로 정렬하고 싶으면 Comparator에 .reversed()붙이기
  • 중요포인트는 reversed()를 쓰기 위해선 (Integer i) 처럼 람다 파라미터의 타입을 명시해야 한다
  • 타입 안 쓰면 모다? 컴파일 에러다~

Comparator 체이닝 (복합 정렬)

이건 정렬 기준을 여러 개 적용하는 것이다. 예를 들면 "등수가 같을 때는 학생 번호가 더 빠른순으로 졍렬하기" 이다.

예시 데이터

  • 학생 번호 : 0, 1, 2, 3
  • 등수(rank) : {2, 1, 1, 3}
    → 학생 1번, 2번은 동점 2등이고 이럴 때는 번호가 빠른 쪽이 먼저 와야 함.

정렬 기준

  1. 등수(rank)가 낮을 수록 우선 (오름차순)
  2. 등수가 같아면 → 학생 번호가 낮을 수록 우선 (오름차순)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        int[] rank = {2, 1, 1, 3};
        List<Integer> candidates = Arrays.asList(0, 1, 2, 3);

        // 정렬: 등수 오름차순, 등수 같으면 학생 번호 오름차순
        candidates.sort(
            Comparator
                .comparingInt((Integer i) -> rank[i]) // rank 기준 오름차순
                .thenComparingInt(i -> i)             // 번호 기준 오름차순
        );

        System.out.println(candidates); // 출력 결과: [1, 2, 0, 3]
    }
}