Java - 정렬된 순서로 Map(HashMap) 순회

HashMap은 for문으로 요소를 순회할 때 정렬되지 않은 순서로 순회합니다. 이 글에서는 정렬된 순서로 Map, HashMap을 순회하는 방법을 소개합니다.

1. Map.Entry 리스트를 정렬하여 순회

HashMap.entrySet()은 Map의 요소를 Entry 객체로 Set에 저장하고 리턴합니다. 리턴된 Set은 ArrayList 생성자의 인자로 전달하여 리스트로 만들 수 있습니다.

이렇게 만들어진 리스트를 sort()로 정렬하고 for문으로 순회할 수 있습니다. 아래 예제에서는 Key를 기준으로 오름차순 정렬하였습니다.

import java.util.*;

public class Example1 {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 400);
        map.put("kiwi", 200);
        map.put("grape", 300);
        map.put("banana", 150);

        List<Map.Entry<String, Integer>> entries = new ArrayList<>(map.entrySet());

        entries.sort(Comparator.comparing(Map.Entry::getKey));
        entries.forEach(System.out::println);
    }
}

Output:

apple=400
banana=150
grape=300
kiwi=200

만약 value를 기준으로 정렬하고 싶을 때는, comparing(Map.Entry::getValue)와 같이 구현할 수 있습니다.

entries.sort(Comparator.comparing(Map.Entry::getValue));

2. Stream으로 정렬 및 순회

아래 예제와 같이 Map의 EntrySet을 Stream으로 만들고, Stream에서 정렬하고 순회할 수 있습니다.

import java.util.*;

public class Example2 {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 400);
        map.put("kiwi", 200);
        map.put("grape", 300);
        map.put("banana", 150);

        map.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey))
                .forEach(System.out::println);
    }
}

Output:

apple=400
banana=150
grape=300
kiwi=200

3. TreeMap으로 정렬 및 순회

TreeMap은 입력 순서가 유지되는 자료구조입니다. 즉, 모든 요소를 순회할 때 요소가 입력된 순서대로 순회합니다.

만약 데이터를 정렬한 뒤에 Map에 저장해야 할 때는 TreeMap을 사용할 수 있습니다. 정렬된 순서로 요소가 저장되기 때문에 순회할 때 Map을 정렬할 필요 없이 반복문으로 순회하면 됩니다.

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

public class Example {

    public static void main(String[] args) {

        Map<String, Integer> map = new TreeMap<>();
        map.put("apple", 400);
        map.put("kiwi", 200);
        map.put("grape", 300);
        map.put("banana", 150);

        map.entrySet().forEach(System.out::println);
    }
}

Output:

apple=400
banana=150
grape=300
kiwi=200
Loading script...
codechachaCopyright ©2019 codechacha