102 「Map修羅道」 Step05 解答例

MapUtil.java

import java.util.*;

public class MapUtil {
    public static void compareMapOrder() {
        // --- HashMapを使った場合 ---
        System.out.println("=== HashMap の出力 ===");

        // 順序が保証されないMap
        Map<String, String> hashMap = new HashMap<>();
        hashMap.put("2023-05-03", "Curry");
        hashMap.put("2023-05-01", "Sushi");
        hashMap.put("2023-05-02", "Pasta");

        for (String date : hashMap.keySet()) {
            String menu = hashMap.get(date);
            System.out.println(date + " → " + menu);
        }

        // --- TreeMapを使った場合 ---
        System.out.println("=== TreeMap の出力 ===");

        // TreeMapにHashMapの内容を渡して変換
        Map<String, String> treeMap = new TreeMap<>(hashMap);

        for (String date : treeMap.keySet()) {
            String menu = treeMap.get(date);
            System.out.println(date + " → " + menu);
        }
    }
}

解説:Mapに順序を求めるときの注意点

JavaのMapにはいくつかの実装があります。
それぞれ順序の扱いが異なるため、出力の順番に意味がある場合は注意が必要です。


HashMap:順序なし(非決定的)

Map<String, String> map = new HashMap<>();
  • 要素の並び順は保証されない
  • 登録順にも、キーの大小にも関係ない
  • 出力結果は実行のたびに変わる可能性あり(内部のハッシュテーブル次第)

TreeMap:キーの自然順(昇順)

Map<String, String> map = new TreeMap<>(hashMap);
  • キーの順序に従って自動で並び替えて保持
  • 文字列なら辞書順、数値なら昇順になる
  • new TreeMap<>(hashMap) のように変換も可能

実行結果の例(順不同・ただしTreeMapは昇順で固定)

=== HashMap の出力 ===
2023-05-03 → Curry
2023-05-01 → Sushi
2023-05-02 → Pasta

=== TreeMap の出力 ===
2023-05-01 → Sushi
2023-05-02 → Pasta
2023-05-03 → Curry

まとめ:このステップで学ぶべきこと

  • HashMapは順序を持たない
  • TreeMapはキーの昇順で保持される
  • 順序が重要な場合はMapの種類を選ぶ必要がある

出力の順序でロジックが変わる場面では、Mapの選定がバグを防ぐ鍵になります。

102 ステップアップ問題 「Map修羅道」