Java로 알고리즘 문제를 풀다가 TreeMap을 사용하는 경우가 생겼다. 데이터를 정렬하기 위해서 Comparator에 대한 정의가 필요했지만 다양해서 헷갈리고 있다. 이참에 Comparator를 정의하는 방법들을 정리해보자.
Java 8 이전 버전에서 주로 사용되던 방식이다. 익명 클래스를 통해 Comparator를 정의한다.
숫자형
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer key1, Integer key2) {
// 오름차순
return key1 - key2;
// 내림차순
// return key2 - key1;
}
문자열
Comparator<String> stringComparator = new Comparator<String>() {
@Override
public int compare(String str1, String str2) {
// 알파벳 순서 (오름차순)
return str1.compareto(str2);
// 알파벳 역순 (내림차순)
//return str2.compareTo(str1);
}
}
Java 8 이상에서는 람다 표현식을 활용하여 정의할 수 있다.
수치형
// 내림차순 정렬
TreeMap<Integer, String> treeMapDesc = new TreeMap<>((key1, key2) -> key2 - key1);
// 오름차순 정렬
TreeMap<Integer, String> treeMapAsc = new TreeMap<>((key1, key2) -> key1 - key2);
문자열
// 알파벳 역순 정렬
TreeMap<String, Integer> stringTreeMapDesc new TreeMap((str1, str) -> str2.compareTo(str1));
// 알파벳 순서 정렬
TreeMap<String, Integer> stringTreeMapAsc new TreeMap((str1, str) -> str1.compareTo(str2));
Comparator는 인터페이스다. 그러므로 직접 구현해서 정의하는 방식이 있다.
숫자형
class DescendingComparator implements Comparator<Integer> {
@Override
public int compare(Integer key1, Integer key2) {
// 오름차순
// return key1 - key2;
// 내림차순
return key2 - key1;
}
문자열
class StringDescendingComparator implements Comparator<String> {
@Override
public int compare(String str1, String str2) {
// 알파벳 역순 정렬
return str2.compareTo(str1);
}
}