오늘개발일지

[Java] HashMap 키(Key) / 값(Value) 기준 정렬 본문

Programming Language/Java

[Java] HashMap 키(Key) / 값(Value) 기준 정렬

chlgksdbs 2023. 5. 28. 00:46

HashMap

이번 포스팅은 자바에서 HashMap을 키(Key) 또는 값(Value)를 기준으로 정렬하는 방법에 대해 알아보겠습니다.
우선, 정렬에 대해 알아보기에 앞서, Java 17 공식 문서에 있는 HashMap의 메서드에 대해 알아보겠습니다.

  • entrySet() : HashMap에 저장된 모든 key와 value들을 Set<Map, Entry<K, V>> 형태로 return
  • keySet() : HashMap에 저장된 모든 key들을 Set 형태로 return

  1. HashMap 키(Key) 정렬

먼저 HashMap을 키(Key)로 정렬하는 방법에 대해 알아보겠습니다. 아래의 코드는 keySet() 메서드를 이용하여 Map에 있는 모든 key들을 List 형태로 바꾸고, lambda 표현식을 통해 이를 오름차순으로 정렬합니다.


package blog;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {

    // 1. HashMap을 키(Key) 기준 정렬
    public static void main(String[] args) {

        Map<Integer, String> map = new HashMap<Integer, String>();

        // Map에 Key / Value 쌍의 데이터 추가
        map.put(2, "banana");
        map.put(3, "grape");
        map.put(5, "strawberry");
        map.put(1, "apple");
        map.put(4, "watermelon");

        // Map -> List 형태로 저장
        List<Integer> keyList = new ArrayList<Integer>(map.keySet());
        keyList.sort((s1, s2) -> s1.compareTo(s2)); // lambda 표현식

        // 결과 출력
        for (int key : keyList) {
            System.out.println(key + ": " + map.get(key));
        }
    }
}

위 코드의 Console 창의 출력 결과는 다음과 같습니다.


  1. HashMap 값(Value) 정렬

다음으로, HashMap을 값(Value)로 정렬하는 방법에 대해 알아보겠습니다. Map의 데이터의 Key-Value 쌍은 위 코드와 다르게 변경하였습니다. 총 3가지의 방법이 존재했지만, 가장 단순하게 정렬이 가능한 방법은 lambda 표현식을 이용한 정렬이였습니다.


package blog;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class Main {

    // 2. HashMap을 값(Value) 기준 정렬
    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<String, Integer>();

        // Map에 Key / Value 쌍의 데이터 추가
        map.put("banana", 2);
        map.put("grape", 3);
        map.put("strawberry", 5);
        map.put("apple", 1);
        map.put("watermelon", 4);

        // Map -> List 형태로 저장
        List<Map.Entry<String, Integer>> entryList = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());

        // (1) Entry 내장 함수를 사용한 정렬
//        entryList.sort(Map.Entry.comparingByValue());
//        
//        for (Map.Entry<String, Integer> entry : entryList) {
//            System.out.println(entry.getKey() + ": " + entry.getValue());
//        }

        // (2) Comparator를 사용한 정렬
//        Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() {
//
//            @Override
//            public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
//                // TODO Auto-generated method stub
//                // 오름차순 정렬 (내림차순은 아래 순서를 바꿔서 뺄셈)
//                return o1.getValue() - o2.getValue();
//            }
//        });
//                
        // (3) lambda 표현식을 사용한 정렬 (오름차순 정렬)
        Collections.sort(entryList, (o1, o2) -> {
            return map.get(o1.getKey()) - map.get(o2.getKey());
        });

        // 결과 출력 ((1), (2), (3) 모두 동일)
        for (Map.Entry<String, Integer> entry : entryList) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

위 코드의 Console 창의 출력 결과는 다음과 같습니다.


  1. TreeMap을 사용한 키(Key) 정렬

마지막으로, TreeMap을 사용한 정렬에 대해 알아보겠습니다. TreeMap은 put 메서드를 사용하여 값을 삽입할 때, key값을 기준으로 자동 오름차순 정렬을 합니다.


package blog;

import java.util.Map;
import java.util.TreeMap;

public class Main {

    // 3. TreeMap을 키(Key) 기준 정렬
    public static void main(String[] args) {

        Map<Integer, String> map = new TreeMap<Integer, String>();

        // Map에 Key / Value 쌍의 데이터 추가
        map.put(2, "banana");
        map.put(3, "grape");
        map.put(5, "strawberry");
        map.put(1, "apple");
        map.put(4, "watermelon");

        // 결과 출력
        for (int key : map.keySet()) {
            System.out.println(key + ": " + map.get(key));
        }
    }
}

위 코드의 Console 창의 출력 결과는 다음과 같습니다.


이번 포스팅에서는 HashMap을 키(Key)와 값(Value)으로 정렬하는 방법에 대해 알아보았습니다. 이번 블로그 글을 작성하면서, 다시금 기본기에 대해 복습해야겠다는 생각이 들었습니다. 다음 포스팅은 정렬에 사용된 메서드(Comparator, Comparable, lambda 등)들에 대해 공부하여 작성하겠습니다.

'Programming Language > Java' 카테고리의 다른 글

[Java] substring 문자열 자르기  (0) 2023.09.23
[Java] EOF(End of File) 처리  (0) 2023.04.27