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の選定がバグを防ぐ鍵になります。