Java

[JAVA] Comparator와 람다함수를 이용한 정렬

LimeCoding 2023. 8. 3. 11:49

 프로그래머스 문제를 풀면서 Comparator, lambda 함수를 이용하여 HashMap을 정렬할 때가 있는데 이때 항상 내림차순으로 정렬하되 값이 같으면 오름차순으로 정렬하는 문제가 나올 때가 있다.

 그런 문제는 어김없이 Comparator나 lambda 함수를 이용해 정렬을 시도하는데 정렬하는 내용을 보면 내림차순에 대한 정렬기준은 있지만 오름차순에 대한 정렬기준은 없다. 그래서 어떤 방식으로 정렬되는지 실험을 좀 해보았다.

 

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();

        map.put("A", 10);
        map.put("C", 10);
        map.put("B", 10);
        map.put("D", 10);


        List<String> keySet = new ArrayList<>(map.keySet());
        
        keySet.sort((o1, o2) -> {
            int a = map.get(o2).compareTo(map.get(o1));
            
            // 기본은 오름차순 정렬
            // 주석을 풀면 키값을 기준으로 역순 정렬한다.
//            if(a == 0)
//                a = o2.compareTo(o1);
            return a;
        });

        for (String key : keySet) {
            System.out.print("Key : " + key);
            System.out.println(", Val : " + map.get(key));
        }
    }
}

 

 저기서 if부분없이 정렬을 시도할 경우 순서는 A, B, C, D순서대로 나온다. value값이 다르면 내림차순으로 정렬을 시도하지만 value값이 같은 경우 키값을 기준으로 오름차순 정렬을 시도한다.

만약 키값도 역순으로 정렬을 하고 싶다면 같은 경우 키값을 역순 정렬하는 조건을 추가하면 된다. (주석처리된 if문)