그 외 ... (정리해야함)/꿀팁

[JAVA] Map에 있는 데이터를 Value기준으로 정렬하기

깡냉쓰 2018. 9. 18. 17:52
728x90
반응형

Map의 Value데이터 기준으로 정렬하기


TreeSet을 이용하면 Key 기준으로 쉽게 정렬할 수 있으나, Value로 정렬해주는 컬렉션은 존재하지 않는다.

Value로 map을 정렬을 하려면 Comparator 인터페이스를 이용해야 한다.

밑에 예제는 Value를 기준으로 내림차순으로 정렬을 하고, Value가 같다면 Key를 기준으로 오름차순으로 정렬하는 예제이다.

package sort;

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class MapSortTest {
    public static void main(String[] args){
        Map<String, Integer> map = new HashMap<>();
        map.put("A", 4);
        map.put("B", 4);
        map.put("C", 4);
        map.put("D", 2);
        map.put("E", 6);
        map.put("F", 1);
        map.put("G", 2);

        // value 내림차순으로 정렬하고, value가 같으면 key 오름차순으로 정렬
        List<Map.Entry<String, Integer>> list = new LinkedList<>(map.entrySet());

        Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                int comparision = (o1.getValue() - o2.getValue()) * -1;
                return comparision == 0 ? o1.getKey().compareTo(o2.getKey()) : comparision;
            }
        });

        // 순서유지를 위해 LinkedHashMap을 사용
        Map<String, Integer> sortedMap = new LinkedHashMap<>(); 
        for(Iterator<Map.Entry<String, Integer>> iter = list.iterator(); iter.hasNext();){
            Map.Entry<String, Integer> entry = iter.next();
            sortedMap.put(entry.getKey(), entry.getValue());
        }

        System.out.println(sortedMap);
    }
}

-- result --

{E=6, A=4, B=4, C=4, D=2, G=2, F=1}

익명클래스 Comparator를 구현하여 sort메소드에 전달

=> 내림차순 정렬이기 때문에 value를 비교하여 -1 을 곱해주었고, value가 같을 경우 Key값의 오름차순으로 정렬하는 Compare메소드를 구현

728x90
반응형