Java HashMap 정렬 방법

배수연·2024년 9월 18일

algorithm

목록 보기
43/45

기본적으로 LinkedHashMap을 사용하면, 입력된 Key의 순서대로 정렬된 Map을 제공한다. 그러나 오름차순/내림차순 등의 다른 정렬 방법이 필요하다면, key 또는 value로 정렬이 가능하다.

Key 값으로 정렬

예제 : 백준 20291 - 파일정리

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        
        HashMap<String, Integer> map = new HashMap<>();
        for(int i = 0; i<n; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            String[] str = st.nextToken().split("\\.");
            map.put(str[1], map.getOrDefault(str[1], 0)+1);
        }
        
        List<String> keySet = new ArrayList<>(map.keySet());
        Collections.sort(keySet);
        for (String key : keySet){
            System.out.println(key + " " + map.get(key));
        }
    }
}

map의 keySet을 이용하여 정렬한다.
Collections.sort()는 기본적으로 오름차순을 지원한다.
내림차순으로 정렬하려면 Collections.sort(keySet, Collections.reverseOrder())과 같이 인자를 추가해주면 된다.

        List<String> keySet = new ArrayList<>(map.keySet());
        Collections.sort(keySet); //내림차순
        //Collections.sort(keySet, Collections.reverseOrder()); //오름차순

Value 값으로 정렬

1. Comparator 이용

key로 정렬하는 것과 마찬가지로 keySet을 이용한다.
keySet.sort() 함수를 사용하되, comparator를 사용하여 정렬한다.

        List<String> keySet = new ArrayList<>(map.keySet());
		keySet.sort(new Comparator<String>() {
            @Override //오름차순
            public int compare(String o1, String o2) {
                return map.get(o1).compareTo(map.get(o2));
            }
        });
        keySet.sort(new Comparator<String>() {
            @Override //내림차순
            public int compare(String o1, String o2) {
                return map.get(o2).compareTo(map.get(o1));
            }
        });

comparator는 람다 표현식으로 아래와 같이 간단히 표현할 수도 있다.

		keySet.sort((o1, o2) -> map.get(o1).compareTo(map.get(o2)));
        keySet.sort((o1, o2) -> map.get(o2).compareTo(map.get(o1)));

2. Entry의 comparingByValue 함수 사용

Map.Entry에 있는 comparingByValue를 이용해 정렬할 수 있다. (오름차순)

		List<Map.Entry<String, Intger>> entryList = new LinkedList<>(map.entrySet());
        entryList.sort(Map.Entry.comparingByValue());
        for(Map.Entry<String, Integer> entry : entryList) {
        	System.out.println("key : " + entry.getKey());
			System.out.println("value : " + entry.getValue());
		}

Ref.
https://velog.io/@dev-easy/Java-Map을-Key-Value로-정렬하기
https://yoonnyoon.tistory.com/131

0개의 댓글