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,1과 1,-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 좌표 기준 정렬
}
});
e1과 e2의 역할 (중요!! 이해를 꼭 해야 된다 )
- e1과 e2는 각각 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 클래스를 정의하면 코드 재사용성이 높아짐
'개발일기 > TIL(Since24.04.19)' 카테고리의 다른 글
멀티 모듈 방식이란? (0) | 2025.03.26 |
---|---|
Swagger와 RestDocs 비교: 장단점 (0) | 2025.02.24 |
프로그래머스 배열 만들기 2 (0) | 2024.09.05 |
프로그래머스 수열과 구간 쿼리 3 (0) | 2024.09.04 |
프로그래머스 수조작하기 1 (0) | 2024.09.03 |