📌 まずは問題を見ろ
→ javadrill.tech で出題された問題を見る(Step06)
問題のポイント
Map
は 「キーから値」には強いが、「値からキー」は不得意。- 逆引きが必要な場合は、自分でループを書け。
entrySet()
を使えば、キーと値を同時に扱える。
まず、日本語で考えろ
- 商品IDと商品名の対応表がある。
- 与えられた商品名(Banana)に対応するIDを探したい。
- Mapには「値 → キー」の直接検索はない。だからループして探すしかない。
コメントを書け
// 商品データを Map に登録する(キー: ID, 値: 商品名)
// 目的の商品名を変数に保持する
// Map をループして、値が一致するキーを探す
// 見つかればIDを出力、なければ「見つかりませんでした」
コメントに従ってコードを書け
import java.util.*;
public class MapUtil {
public static void findProductIdByName() {
// 商品データを Map に登録する(キー: ID, 値: 商品名)
Map<Integer, String> productMap = new HashMap<>();
productMap.put(101, "Apple");
productMap.put(102, "Banana");
productMap.put(103, "Orange");
// 目的の商品名を変数に保持する
String targetName = "Banana";
// Map をループして、値が一致するキーを探す
Integer foundId = null;
for (Map.Entry<Integer, String> entry : productMap.entrySet()) {
if (entry.getValue().equals(targetName)) {
foundId = entry.getKey();
break;
}
}
// 結果を出力する
System.out.println("商品名: " + targetName);
if (foundId != null) {
System.out.println("商品ID: " + foundId);
} else {
System.out.println("見つかりませんでした");
}
}
}
実行結果の例
商品名: Banana
商品ID: 102
コードの解説
Map<Integer, String>
にIDと商品名を登録。- 目的の商品名
"Banana"
を変数に持つ。 entrySet()
をループして、値が一致するエントリのキー(ID)を取得。- 見つかったらIDを表示、見つからなければ
"見つかりませんでした"
。
つまづきやすいポイント
map.containsValue()
で存在チェックはできるが、キーは取れない。entrySet()
をループすることで、キーと値を同時に扱える。- Mapは「値からキー」には向かないという構造を、コードを書いて体感せよ。
teshのひとこと
Mapに向かって「この値、どのキーやねん」って聞くのは、ちょっと不自然な問いかけや。
Mapは「キー → 値」のために作られてる。逆をやるときは、自分で構造に潜れ。
道具の得意・不得意を、書いて知れ。
そうすりゃ、無茶な使い方もしなくなる。
Just keep typing, baby.
逆引きに潜れ。構造に逆らわず、構造を突き詰めろ。