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を使用できます。並べ替えられた順序で要素が格納されるため、巡回するときにマップを並べ替える必要なく繰り返し文で巡回するだけです。

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
codechachaCopyright ©2019 codechacha