Comparator
, Comparable
모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의할 수 있으며 두 객체 모두 비교한다는 같은 기능을 목적으로 고안된 것
차이점은 Comparable
은 기본 정렬 기준을 구현하는데 사용하며 Comparator
은 기본 정렬 기준 외에 다른 기준으로 정렬하고자 할 때 사용한다
public interface Comparator {
int compare(Object o1, Object o2);
}
public interface Comparable {
int compareTo(Object o);
}
Comparable
의 대상은 주로 Integer
와 같은 wrapper
클래스, String
, Date
, File
과 같은 것들로 오름차순으로 구현되어 있으며 기본 정렬 기준을 구현하는데 사용된다.
static void sort(Object[] a) // 객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬
static void sort(Object[] a, Comparator c) // 지정한 Comparator에 의한 정렬
예를 들어 2차원 배열의 경우 Arrays.sort()
메서드를 사용할 수 없다. 하지만 Comparator
를 이용해 정렬을 할 수 있는데
import java.util.*;
public class Main {
public static void main(String[] args){
int[][] arr = {
{3, 4}
,{6, 1}
,{6, 4}
,{2, 123}
,{77, 342}
};
Arrays.sort(arr, new Comparator<int[]>(){
public int compare(int[] o1, int[] o2){
if (o1[0] == o2[0]) {
return o1[1] - o2[1];
}
return o1[0] - o2[0];
}
});
System.out.println(Arrays.deepToString(arr)); // [[2, 123], [3, 4], [6, 1], [6, 4], [77, 342]]
}
}
해당 작업은 첫번째 인덱스를 기준으로 오름차순으로 정렬하되 인덱스가 같은 경우 두번째 인덱스 오름차순 기준으로 정렬한 것이다
보다 간단하게 코드를 짠다면 밑과 같이 짤 수 있다
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
int[][] arr = {{7, 8}, {9, 7}, {1, 3}, {1, 1}, {4, 7}, {0, 4}, {-2, 4}, {0, 1}};
Arrays.sort(arr, (o1, o2) -> o1[0] - o2[0] == 0 ? o1[1] - o2[1] : o1[0] - o2[0]);
for(int[] a : arr) {
System.out.println(Arrays.toString(a));
}
}
}
출력
[-2, 4]
[0, 1]
[0, 4]
[1, 1]
[1, 3]
[4, 7]
[7, 8]
[9, 7]