📌 まずは問題を見ろ
→ javadrill.tech で出題された問題を見る(Step03)
問題のポイント
Map<String, List<String>>
というネスト構造の基本put()
だけじゃダメ。Listの存在を確認してから追加する必要がある- 「同じキーに複数の値」=Listを使って“蓄積”せよ
まず、日本語で考えろ
- 「カテゴリ名」ごとに「商品名」がいくつも登録される
- 1カテゴリ=1商品、じゃない
Food
に"Apple", "Banana", "Orange"
を追加してみろ- そのために、どういうMapが必要か?
コメントを書け
// Map<String, List<String>> を作る
// put() じゃなく List に add() する形式で登録する
// カテゴリごとに商品リストを出力する
コメントに従ってコードを書け
import java.util.*;
public class MapUtil {
public static void printCategoryMap() {
// Map<String, List<String>> を作る
Map<String, List<String>> categoryMap = new HashMap<>();
// 商品をカテゴリごとに追加("Food" に3つ、"Clothing" に2つ)
addItem(categoryMap, "Food", "Apple");
addItem(categoryMap, "Food", "Banana");
addItem(categoryMap, "Clothing", "T-shirt");
addItem(categoryMap, "Clothing", "Jeans");
addItem(categoryMap, "Food", "Orange");
// カテゴリごとに商品リストを出力する
for (String category : categoryMap.keySet()) {
System.out.print(category + ": ");
for (String item : categoryMap.get(category)) {
System.out.print(item + " ");
}
System.out.println();
}
}
// 指定カテゴリに商品を追加する共通処理
private static void addItem(Map<String, List<String>> map, String category, String item) {
if (!map.containsKey(category)) {
map.put(category, new ArrayList<>());
}
map.get(category).add(item);
}
}
実行結果の例(順不同)
Food: Apple Banana Orange
Clothing: T-shirt Jeans
コードの解説
Map<String, List<String>>
を使うことで、1カテゴリに複数の商品を持てる。addItem()
メソッドで、List が存在しない場合はnew ArrayList<>()
を作成。map.get(key).add(...)
で、List に要素を追加。- 2重の
for
文でカテゴリと商品を1つずつ出力。
つまづきやすいポイント
- 最初から List があるとは限らない。キーがなければ List を new する必要あり。
map.put(key, new ArrayList<>())
を忘れるとNullPointerException
が出る。Map<String, List<>>
は「配列のMap」ではなく「Mapの中にListがある」構造や。図に描けるようになれ。
teshのひとこと
「ひとつのキーに複数の値」──それ、Mapだけじゃ完結せえへん。
Mapの中にListを持たせることで、“まとまり”が生まれる。
そしてこの構造は、現実世界のデータ管理の基本や。
Just keep typing, baby.
ネストを恐れるな。構造を重ねろ。おまえのコードに現実を写せ。