Java에서 Comparator를 정의하는 다양한 방법

이재훈·2025년 1월 16일

Java로 알고리즘 문제를 풀다가 TreeMap을 사용하는 경우가 생겼다. 데이터를 정렬하기 위해서 Comparator에 대한 정의가 필요했지만 다양해서 헷갈리고 있다. 이참에 Comparator를 정의하는 방법들을 정리해보자.

1. 익명 클래스(Anonymous Class)로 정의하기

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);
    }
}

2. 람다 표현식(Lambda Expression)으로 정의하기

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));

3. 직접 Comparator 클래스 정의하기

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);
    }
}

0개의 댓글