왜 커스텀 정렬이 필요할까?
Java에서 Arrays.sort()나 Collections.sort()를 사용하면 기본적으로 오름차순 정렬이 된다.
내림차순 정렬은 Arrays.sort(배열, Collections.reverseOrder()); 와 같이 사용한다.
(단, sort()에 Collections.reverseOrder()를 인자로 전달하기 위해서 배열은 int[]가 아닌 Integer[]처럼 래퍼클래스여야 함)
Arrays.sort(배열); // 오름차순 (default)
Arrays.sort(배열, Collections.reverseOrder()); // 내림차순
하지만 코딩테스트에서는 종종 특정 조건에 따라 정렬해야 할 상황이 생긴다.
- 문자열 길이 기준 정렬
- 객체의 점수 기준 내림차순 정렬
- 두 가지 조건(점수 → 이름 순)으로 정렬 등등…
이럴 때는 람다식을 이용한 커스텀 정렬이 유용하게 쓰일 수 있다.
기본 문법
Arrays.sort(배열, (a, b) -> 비교 로직);
- a와 b는 배열 속 두 원소이다.
- 반환값이
- 음수면 a가 b보다 앞에
- 0이면 순서 유지
- 양수면 b가 a보다 앞에
자주 쓰는 커스텀 정렬 포맷
정렬 기준 | 람다 표현식 |
오름차순 정렬 | (a, b) -> a - b |
내림차순 정렬 | (a, b) -> b - a |
문자열 길이 정렬 | (a, b) -> a.length() - b.length() |
객체 필드 정렬 | (a, b) -> a.score - b.score 등 |
여러 조건 정렬 | (a, b) -> 조건1 != 조건2 ? 조건1 : 조건2 |
예제 1: 문자열 배열을 길이 순으로 정렬하기
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
String[] words = {"banana", "kiwi", "apple", "fig"};
Arrays.sort(words, (a, b) -> a.length() - b.length());
System.out.println(Arrays.toString(words));
}
}
// 결과
[fig, kiwi, apple, banana]
예제 2: 객체 배열을 점수 기준으로 내림차순 정렬하기
import java.util.Arrays;
class Student {
String name;
int score;
Student(String name, int score) {
this.name = name;
this.score = score;
}
public String toString() {
return name + "(" + score + ")";
}
}
public class Main {
public static void main(String[] args) {
Student[] students = {
new Student("철수", 85),
new Student("영희", 92),
new Student("민수", 75)
};
Arrays.sort(students, (a, b) -> b.score - a.score); // 내림차순
System.out.println(Arrays.toString(students));
}
}
// 결과
[영희(92), 철수(85), 민수(75)]
예제 3: 두 조건으로 정렬 (점수 내림차순 → 이름 오름차순)
Arrays.sort(students, (a, b) -> {
if (b.score != a.score) return b.score - a.score; // 점수 내림차순
return a.name.compareTo(b.name); // 이름 오름차순 (점수가 같을 때만)
});
익명 클래스 vs 람다식
// 람다 없이 쓰면 이렇게 복잡해짐
Arrays.sort(words, new Comparator<String>() {
public int compare(String a, String b) {
return a.length() - b.length();
}
});
// 람다를 쓰면 한 줄로 끝
Arrays.sort(words, (a, b) -> a.length() - b.length());
- Java 8 이상부터 람다를 사용할 수 있으며, 복잡한 조건일수록 가독성을 위해 따로 Comparator를 정의하거나 메서드 참조를 사용하는 것도 좋다.
'코딩테스트 > 자바 스터디' 카테고리의 다른 글
인텔리제이(Intellij) 화면 확대/축소 줌인/줌아웃 배율 설정하기 (0) | 2024.12.20 |
---|---|
Main.java uses unchecked or unsafe operations. 경고 대처법 (0) | 2024.11.08 |
인텔리제이(Intellij) 자동완성 기능 끄기 (0) | 2024.10.18 |
리플릿(Replit) 자동완성 기능 끄기 (0) | 2024.10.10 |
리플릿(Replit)으로 웹에서 코딩하기 (Java, Python, C++ 등) (3) | 2024.10.10 |