Map修羅道:Step06

0003_Map修羅道-step06 learn

📌 まずは問題を見ろ

→ 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.
逆引きに潜れ。構造に逆らわず、構造を突き詰めろ。


👉 Map修羅道:全体のステップ構成はこちら