[Java] Comparator 내림차순 정렬 할 때 주의사항
예시코드
- 프로그래머스 전국 대회 선발 조사 문제
- https://school.programmers.co.kr/learn/courses/30/lessons/181851
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등이고 이럴 때는 번호가 빠른 쪽이 먼저 와야 함.
정렬 기준
- 등수(rank)가 낮을 수록 우선 (오름차순)
- 등수가 같아면 → 학생 번호가 낮을 수록 우선 (오름차순)
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]
}
}