백준 문제를 풀던 중, 한 번에 3가지의 개념 정리가 필요할 것으로 보아 블로그에 글을 작성한다.
Comparator
는 Java에서 객체 간 순서를 정의하는 데 사용되는 인터페이스. 주로 정렬 기준을 설정하기 위해 사용하며, Arrays.sort()
또는 Collections.sort()
와 함께 많이 사용됨. Comparator
는 비교 기준을 외부에서 설정할 수 있다는 점에서, 클래스 내부에 정렬 기준을 설정하는 Comparable
과 다름.
Comparator
인터페이스는 다음과 같은 단일 메서드를 포함:
int compare(T o1, T o2);
o1
과 o2
는 비교할 두 객체.compare()
메서드는 다음 값을 반환:o1
이 o2
보다 작을 경우.o1
과 o2
가 같은 경우.o1
이 o2
보다 클 경우.익명 클래스를 사용해 Comparator
를 구현하여 2차원 배열을 정렬하는 예시:
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
int[][] arr = {
{5, 3},
{2, 4},
{2, 1},
{4, 6},
{5, 2}
};
// 첫 번째 열 기준으로 정렬하고, 같을 경우 두 번째 열 기준으로 정렬
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] a, int[] b) {
if (a[0] != b[0]) {
return Integer.compare(a[0], b[0]);
}
return Integer.compare(a[1], b[1]);
}
});
// 정렬된 결과 출력
for (int[] row : arr) {
System.out.println(Arrays.toString(row));
}
}
}
위 예제에서 Arrays.sort()
메서드를 사용해 2차원 배열을 정렬하며, 각 행을 Comparator
를 통해 비교. 첫 번째 열을 기준으로 비교하고, 같으면 두 번째 열을 기준으로 정렬.
Java 8부터는 람다 표현식을 사용할 수 있음. 덕분에 Comparator
와 같은 기능성 인터페이스를 더 간결하게 구현할 수 있음. 아래는 익명 클래스 예제를 람다 표현식으로 간소화한 것:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[][] arr = {
{5, 3},
{2, 4},
{2, 1},
{4, 6},
{5, 2}
};
// 첫 번째 열 기준으로 정렬하고, 같으면 두 번째 열 기준으로 정렬 (람다 사용)
Arrays.sort(arr, (a, b) -> {
if (a[0] != b[0]) {
return Integer.compare(a[0], b[0]);
}
return Integer.compare(a[1], b[1]);
});
// 정렬된 결과 출력
for (int[] row : arr) {
System.out.println(Arrays.toString(row));
}
}
}
위 람다 표현식은 두 배열(int[] a
, int[] b
)을 받아 첫 번째 값을 기준으로 비교하고, 같으면 두 번째 값을 비교. 익명 클래스보다 훨씬 간결하게 Comparator
구현 가능.
람다 표현식은 삼항 연산자를 사용해서 더 간단하게 작성할 수 있음:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[][] arr = {
{5, 3},
{2, 4},
{2, 1},
{4, 6},
{5, 2}
};
// 한 줄로 표현한 다중 조건 정렬 (삼항 연산자 사용)
Arrays.sort(arr, (a, b) -> a[0] != b[0] ? Integer.compare(a[0], b[0]) : Integer.compare(a[1], b[1]));
// 정렬된 결과 출력
for (int[] row : arr) {
System.out.println(Arrays.toString(row));
}
}
}
Comparator
인터페이스: 두 객체 간 순서를 정의하기 위해 사용됨. compare()
메서드를 구현하여 커스텀 정렬 기준을 설정.Comparator
를 구현했음. 코드가 장황하고 반복적임.Comparator
를 더 간결하게 표현하기 위해 람다식을 사용함. 코드가 짧아지고 가독성이 향상됨.Arrays.sort(arr, comparator)
를 사용해 2차원 배열의 각 행을 정렬. compare(int[] a, int[] b)
는 각 행을 비교하여 순서를 결정.