📌 まずは問題を見ろ
→ javadrill.tech で出題された問題を見る(Step07)
問題のポイント
Map<String, Map<String, Integer>>
を使ったネスト構造の管理- 外側:店舗名 → 内側:商品名 → 値:在庫数
- 2段階で
containsKey()
を使い、Mapの初期化をミスらないように
まず、日本語で考えろ
- 複数の店舗がある。
- 各店舗ごとに、いろんな商品の在庫がある。
- 店舗ごとにMapを持たせる必要がある。
- 出力形式は:
Tokyo:
Apple → 10
Banana → 5
コメントを書け
// 店舗ごとの在庫Mapを持つMap(Map<String, Map<String, Integer>>)を作る
// 店舗と商品と在庫数を登録する
// 店舗ごとに商品と在庫を出力する(2重ループ)
コメントに従ってコードを書け
import java.util.*;
public class MapUtil {
public static void printStoreInventory() {
// 店舗ごとの在庫Mapを持つMap(Map<String, Map<String, Integer>>)を作る
Map<String, Map<String, Integer>> storeInventory = new HashMap<>();
// データ登録:Tokyo店
addStock(storeInventory, "Tokyo", "Apple", 10);
addStock(storeInventory, "Tokyo", "Banana", 5);
// データ登録:Osaka店
addStock(storeInventory, "Osaka", "Apple", 7);
addStock(storeInventory, "Osaka", "Orange", 3);
// 店舗ごとに商品と在庫を出力する(2重ループ)
for (String store : storeInventory.keySet()) {
System.out.println(store + ":");
Map<String, Integer> stockMap = storeInventory.get(store);
for (String item : stockMap.keySet()) {
System.out.println(item + " → " + stockMap.get(item));
}
}
}
// 在庫を登録する共通処理
private static void addStock(Map<String, Map<String, Integer>> inventory,
String store, String item, int count) {
if (!inventory.containsKey(store)) {
inventory.put(store, new HashMap<>());
}
inventory.get(store).put(item, count);
}
}
実行結果の例(順不同)
Tokyo:
Apple → 10
Banana → 5
Osaka:
Apple → 7
Orange → 3
コードの解説
- 外側のMapが「店舗 → 商品Map」、内側のMapが「商品名 → 在庫数」。
addStock()
メソッド内で、外側のMapにその店舗がなければ内側Mapを初期化。- 2重ループで、外側 → 内側の順に出力。構造を順にたどるイメージ。
つまづきやすいポイント
Map<String, Map<...>>
は、「構造」としてちゃんと図にして理解しないと混乱する。- 外側のMapに対して
containsKey()
で確認し、内側Mapを new してから使うことを忘れがち。 - 出力も2重ループ。ループの中で何をループしているのか、構造に即して考えろ。
teshのひとこと
Mapの中にMap。
構造が増えたとたん、頭の中が混乱して止まるやつが続出や。
でもな、複雑なのは構造じゃなくて、おまえの思考のほうや。
図に描け。言葉で説明しろ。それができたら、ネストは怖くない。
Just keep typing, baby.
階層を読め。構造を重ねて、現実を支配しろ。