/** * ドメイン非依存URL出力フィルタ * javadrill.tech移行時はwp_options.home/siteurlのみ変更すればよい * * データベースには絶対URL(https://minner.asia)を保持し、 * 表示時に現在のドメイン(home_url())に動的変換する */ function javadrill_make_urls_dynamic($content) { if (empty($content)) { return $content; } // データベース内の絶対URLを現在のhome_url()に置換 $old_url = 'https://minner.asia'; $new_url = untrailingslashit(home_url()); // http版も対応(念のため) $content = str_replace($old_url, $new_url, $content); $content = str_replace('http://minner.asia', $new_url, $content); return $content; } // 投稿本文、ウィジェット、タームの説明、抜粋に適用 add_filter('the_content', 'javadrill_make_urls_dynamic', 20); add_filter('widget_text', 'javadrill_make_urls_dynamic', 20); add_filter('term_description', 'javadrill_make_urls_dynamic', 20); add_filter('get_the_excerpt', 'javadrill_make_urls_dynamic', 20); 102「Map修羅道」 | Javaドリル https://minner.asia 楽々学べるJavaの問題集 Fri, 05 Sep 2025 01:55:52 +0000 ja hourly 1 https://wordpress.org/?v=6.8.3 https://minner.asia/wp-content/uploads/2023/10/cropped-logo-32x32.png 102「Map修羅道」 | Javaドリル https://minner.asia 32 32 102 「Map修羅道」 StepFinal 解答例 https://minner.asia/archives/5008 https://minner.asia/archives/5008#respond Mon, 19 May 2025 01:56:52 +0000 http://localhost/?p=5008

MapUtil.java

import java.util.*;

public class MapUtil {
    public static void runOrderSimulator() {
        // 商品ごとの単価を保持するMap
        Map<String, Integer> priceMap = new HashMap<>();
        priceMap.put("Apple", 120);
        priceMap.put("Banana", 80);
        priceMap.put("Orange", 100);

        // 注文数を保持するMap
        Map<String, Integer> orderMap = new HashMap<>();
        orderMap.put("Apple", 3);
        orderMap.put("Banana", 5);
        orderMap.put("Grape", 2); // 登録されていない商品

        int total = 0; // 総売上金額

        // 注文Mapをループ
        for (String product : orderMap.keySet()) {
            int quantity = orderMap.get(product);

            // 商品が登録されているかチェック
            if (priceMap.containsKey(product)) {
                int price = priceMap.get(product);
                int subtotal = price * quantity;

                // 明細を出力
                System.out.println(product + " → 単価: " + price + "円, 個数: " + quantity + ", 小計: " + subtotal + "円");

                // 総計に加算
                total += subtotal;
            } else {
                // 商品が見つからない場合はエラー表示
                System.out.println("エラー: 商品 '" + product + "' は未登録です。");
            }
        }

        // 総売上を出力
        System.out.println("総売上: " + total + "円");
    }
}

解説:Mapを使って注文処理を実装する

このステップでは、これまで学んだMap操作を総動員して、実践的な処理を構築します。

ポイントとなる処理

  1. 価格と注文数という「別のMap」を対応させる
    orderMap をループして、各商品名に対して priceMap で単価を参照します。
  2. containsKey() を使って、存在しない商品をチェック
    未登録商品(例:”Grape”)は、エラーとして出力し、集計対象に含めません。
  3. 各商品の小計(単価 × 数量)を計算し、逐次表示
    最後に総売上を合計・出力します。

実行結果の例

Apple → 単価: 120円, 個数: 3, 小計: 360円
Banana → 単価: 80円, 個数: 5, 小計: 400円
エラー: 商品 'Grape' は未登録です。
総売上: 760円

まとめ

  • Mapの組み合わせ(priceMap × orderMap)を自在に使えること
  • containsKey() による存在チェックの重要性
  • 条件分岐とループ処理の組み合わせが自然に書けるか

このFinalステップを自力で書き切れたなら、Mapの基本操作は一通りマスターしたと言って良い。
これでMapにビビることは、もうない。。

102 ステップアップ問題 「Map修羅道」


Just Keep Typing, Baby!では、この「Map修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!

// tesh:
// 腑に落ちるまでが勉強。落としていけ、ここで。

🎯 実習で理解を深めよう

この内容についてJavaDrillで実際に手を動かして学習できます

]]>
https://minner.asia/archives/5008/feed 0
102 「Map修羅道」 StepFinal 問題 https://minner.asia/archives/5006 https://minner.asia/archives/5006#respond Mon, 19 May 2025 01:47:19 +0000 http://localhost/?p=5006

「商品注文シミュレータを完成させよ」

あなたは、商品情報と注文情報をもとに、次のような処理を行う 商品注文シミュレータ を作成します。

以下の2つのMapがすでに存在しています:

  • Map<String, Integer> priceMap:商品名 → 単価(円)
  • Map<String, Integer> orderMap:商品名 → 注文数(個)

以下のデータを使って、各商品の合計金額を計算し、最終的な総売上金額を出力してください。


登録済み商品データ(priceMap)

"Apple"  → 120  
"Banana" → 80  
"Orange" → 100

注文情報(orderMap)

"Apple"  → 3  
"Banana" → 5  
"Grape"  → 2  ← この商品は登録されていない!

要件

  1. 存在しない商品(ここでは "Grape")が注文された場合は 「エラーとして表示」し、計算対象に含めないこと
  2. 正常な商品は「商品名、単価、個数、小計」を出力すること
  3. 最後に総売上金額を出力すること
  4. for文、Map、containsKey()を使用すること(Stream API は使わない)

テストコード(Main.java)

public class Main {
    public static void main(String[] args) {
        MapUtil.runOrderSimulator();
    }
}

ヒント

  • orderMap をループし、商品名で priceMap.containsKey() を確認する
  • 見つかれば「単価 × 注文数」で小計を計算
  • 見つからなければ System.out.println("エラー: ...") で表示
  • すべての小計を足し合わせて総売上を求める

→解答例

102 ステップアップ問題 「Map修羅道」

]]>
https://minner.asia/archives/5006/feed 0
102 「Map修羅道」 Step09 解答例 https://minner.asia/archives/5001 https://minner.asia/archives/5001#respond Mon, 19 May 2025 01:34:04 +0000 http://localhost/?p=5001

MapUtil.java

import java.util.*;

public class MapUtil {
    public static void testRemoveAndReplace() {
        // 会員番号と名前を管理するMapを作成
        Map<Integer, String> memberMap = new HashMap<>();

        // データを登録
        memberMap.put(1, "Yamada");
        memberMap.put(2, "Tanaka");
        memberMap.put(3, "Suzuki");

        // 登録後の出力
        System.out.println("=== 初期状態 ===");
        printMap(memberMap);

        // 会員番号2をremove
        memberMap.remove(2);

        // 削除後の出力
        System.out.println("=== remove後 ===");
        printMap(memberMap);

        // 会員番号3の名前をKatoにreplace
        memberMap.replace(3, "Kato");

        // 更新後の出力
        System.out.println("=== replace後 ===");
        printMap(memberMap);
    }

    // Mapの内容を出力するヘルパーメソッド
    private static void printMap(Map<Integer, String> map) {
        for (Map.Entry<Integer, String> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " → " + entry.getValue());
        }
    }
}

解説:remove() と replace() はまったく違う

Mapでデータを操作するとき、「値を消す」と「値を更新する」は別の操作です。
このステップではその違いを明確に体験します。

  1. Mapに次のデータを登録
    • 1 → “Yamada”
    • 2 → “Tanaka”
    • 3 → “Suzuki”
  2. remove(2) を実行すると、「キー2」とその値がMapから完全に消えます。
  3. replace(3, "Kato") を実行すると、「キー3」の値が “Suzuki” から “Kato” に上書きされます。

出力結果(例)

=== 初期状態 ===
1 → Yamada
2 → Tanaka
3 → Suzuki

=== remove後 ===
1 → Yamada
3 → Suzuki

=== replace後 ===
1 → Yamada
3 → Kato

使い分けのポイント

  • remove(key):キーと値のペアごと削除する
  • replace(key, newValue):値だけを更新(キーは残る)
  • 存在しないキーに対して replace をしても何も起きない

まとめ

Mapの操作には「削除」と「更新」があり、それぞれ明確に役割が違います。
データのライフサイクルを意識して使い分けましょう。


102 ステップアップ問題 「Map修羅道」


Just Keep Typing, Baby!では、この「Map修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!

// tesh:
// 正解だけじゃ、理解にはならん。こっちが本番。

🎯 実習で理解を深めよう

この内容についてJavaDrillで実際に手を動かして学習できます

]]>
https://minner.asia/archives/5001/feed 0
102 「Map修羅道」 Step09 問題 https://minner.asia/archives/4996 https://minner.asia/archives/4996#respond Mon, 19 May 2025 01:30:42 +0000 http://localhost/?p=4996

「削除と更新はぜんぜん違う」

あなたは、会員番号と名前を管理する Map<Integer, String> を扱っています。
次の操作を順に行って、その都度Mapの状態を出力してください:

  1. Mapに次のデータを登録

    • 1 → “Yamada”
    • 2 → “Tanaka”
    • 3 → “Suzuki”
  2. 会員番号2を remove() で削除
  3. 会員番号3の名前を "Kato" に replace() で更新

    要件

    • Map<Integer, String> を使用すること
    • remove(key) と replace(key, value) の挙動の違いを明確にすること
    • 各ステップ後に Map の中身を出力して確認すること
    • 出力には for 文を用いて明示的に表示すること

    テストコード(Main.java)

    public class Main {
        public static void main(String[] args) {
            MapUtil.testRemoveAndReplace();
        }
    }

    ヒント

    • remove() はキーとその値のペアを削除する
    • replace() はキーの値を別の値で上書きする(キーが存在しなければ何もしない)
    • remove() は戻り値あり(削除された値)

    →解答例

    102 ステップアップ問題 「Map修羅道」

    🎯 実習で理解を深めよう

    この内容についてJavaDrillで実際に手を動かして学習できます

    ]]>
    https://minner.asia/archives/4996/feed 0
    102 「Map修羅道」 Step08 解答例 https://minner.asia/archives/4992 https://minner.asia/archives/4992#respond Mon, 19 May 2025 01:12:04 +0000 http://localhost/?p=4992

    MapUtil.java

    import java.util.*;
    
    public class MapUtil {
        public static void testNullBehavior() {
            // 会員IDと氏名を管理するMapを作成(HashMapはnullキー・null値を許容)
            Map<Integer, String> memberMap = new HashMap<>();
    
            // 通常のデータを登録
            memberMap.put(1001, "Yamada");
    
            // nullをキーとして登録(有効)
            memberMap.put(null, "Tanaka");
    
            // nullを値として登録(有効)
            memberMap.put(1002, null);
    
            // Mapの内容を出力
            for (Map.Entry<Integer, String> entry : memberMap.entrySet()) {
                Integer id = entry.getKey();
                String name = entry.getValue();
                System.out.println(id + " → " + name);
            }
    
            // nullキーで取得できるか確認
            System.out.println("nullキーの値: " + memberMap.get(null));
    
            // 値がnullのときの取得確認
            System.out.println("ID 1002 の値: " + memberMap.get(1002));
        }
    }

    解説:HashMapとnullの関係

    JavaのHashMapは、他のMap実装と比べて柔軟で、nullをキーや値に許容します。


    nullキーについて

    map.put(null, "Tanaka");
    • HashMap は nullキーを1つだけ 登録できます
    • すでにnullキーがある状態で再度 put(null, ...) すると、上書きされます
    • TreeMap などでは nullキーは NullPointerException の原因になるので注意

    null値について

    map.put(1002, null);
    • null は 値として何個でも登録可能
    • ただし、null 値と「未登録」を区別するには containsKey() での存在確認が必要
    map.containsKey(1002); // true(nullが登録されている)
    map.get(1002);         // null(値がnull)
    map.containsKey(9999); // false(未登録)

    出力結果の例(順不同)

    1001 → Yamada
    null → Tanaka
    1002 → null
    nullキーの値: Tanaka
    ID 1002 の値: null

    まとめ:このステップで学ぶべきこと

    • HashMapはnullキーを1つ、null値を複数許可する
    • 値がnullなのか、未登録なのかは containsKey() で判別する
    • nullに関する仕様は Map実装ごとに違う ので要注意

    Mapの柔軟さと落とし穴の両方を体験する重要なステップです。


    102 ステップアップ問題 「Map修羅道」


    Just Keep Typing, Baby!では、この「Map修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!

    // tesh:
    // 「意味はわからんけど通った」は一番キケン。確認しとけ。
    ]]>
    https://minner.asia/archives/4992/feed 0
    102 「Map修羅道」 Step08 問題 https://minner.asia/archives/4988 https://minner.asia/archives/4988#respond Mon, 19 May 2025 01:06:07 +0000 http://localhost/?p=4988

    「nullって登録していいの?」

    あなたは、会員IDと氏名を Map<Integer, String> で管理しています。
    次のデータをMapに登録し、すべてを出力してください:

    • 1001 → “Yamada”
    • null → “Tanaka”
    • 1002 → null

    その後、以下を確認してください:

    1. null をキーとして使った場合、登録・取得はできるか?
    2. null を値として使った場合、出力時にどう表示されるか?

    要件

    • HashMap を使うこと(TreeMap は null キーを許さない)
    • null キー・値の登録ができることを確認すること
    • for 文でMapを出力し、結果を明示的に観察すること

    テストコード(Main.java)

    public class Main {
        public static void main(String[] args) {
            MapUtil.testNullBehavior();
        }
    }

    ヒント

    • HashMap は null キーを1つだけ許可する
    • null 値はいくつでもOK(ただし扱いには注意)
    • 出力時に null が見えても、エラーにはならない

    →解答例

    102 ステップアップ問題 「Map修羅道」

    ]]>
    https://minner.asia/archives/4988/feed 0
    102 「Map修羅道」 Step07 解答例 https://minner.asia/archives/4983 https://minner.asia/archives/4983#respond Mon, 19 May 2025 01:01:59 +0000 http://localhost/?p=4983

    MapUtil.java

    import java.util.*;
    
    public class MapUtil {
        public static void printStoreInventory() {
            // 店舗別の商品在庫を記録するMap(ネストされたMap構造)
            // 外側のMap: 店舗名 → 内側のMap
            // 内側のMap: 商品名 → 在庫数
            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);
    
            // --- 出力 ---
            for (String store : storeInventory.keySet()) {
                System.out.println(store + ":");
                Map<String, Integer> products = storeInventory.get(store);
                for (String product : products.keySet()) {
                    int stock = products.get(product);
                    System.out.println("  " + product + " → " + stock);
                }
            }
        }
    
        // ヘルパーメソッド:商品在庫を追加する
        private static void addStock(Map<String, Map<String, Integer>> inventory,
                                     String store, String product, int stock) {
            // 店舗が存在しなければ新しくMapを作成
            if (!inventory.containsKey(store)) {
                inventory.put(store, new HashMap<>());
            }
            // 店舗に対応する商品Mapを取得し、商品と在庫を登録
            inventory.get(store).put(product, stock);
        }
    }

    解説:Mapの中にMap?ネスト構造の使い方

    このステップでは、「Mapの中にMapが入る」というやや複雑な構造を扱います。
    現実のデータ構造では非常によく使われる形です。


    構造の意味

    Map<String, Map<String, Integer>> storeInventory;
    • 外側のMap:キーは「店舗名」、値は「商品→在庫数」を管理するMap
    • 内側のMap:キーは「商品名」、値は「在庫数」

    データの登録方法

    if (!inventory.containsKey(store)) {
        inventory.put(store, new HashMap<>());
    }
    inventory.get(store).put(product, stock);
    • 店舗が初めて登場した場合、内側のMap(商品一覧)を新規作成
    • すでにある店舗には、商品と在庫を追加登録

    出力方法(2重ループ)

    for (String store : storeInventory.keySet()) {
        System.out.println(store + ":");
        for (String product : storeInventory.get(store).keySet()) {
            System.out.println("  " + product + " → " + 在庫数);
        }
    }
    • 外側のMap(店舗)を回しながら
    • 内側のMap(商品)をさらに回して出力

    実行結果の例(順不同)

    Tokyo:
      Apple → 10
      Banana → 5
    Osaka:
      Apple → 7
      Orange → 3

    まとめ:このステップで学ぶべきこと

    • ネストされたMapの構造を作る方法(Map<String, Map<…>>)
    • 初期化の必要性と、ループ構造の正しい組み方
    • 現実的なデータ構造をJavaで扱う力を養う

    このステップを理解すれば、複雑な階層構造のデータをJavaで自在に扱えるようになります。

    102 ステップアップ問題 「Map修羅道」


    Just Keep Typing, Baby!では、この「Map修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!

    // tesh:
    // 何かモヤっとしてる? なら答えはここにある。

    🎯 実習で理解を深めよう

    この内容についてJavaDrillで実際に手を動かして学習できます

    ]]>
    https://minner.asia/archives/4983/feed 0
    102 「Map修羅道」 Step07 問題 https://minner.asia/archives/4980 https://minner.asia/archives/4980#respond Mon, 19 May 2025 00:55:40 +0000 http://localhost/?p=4980

    「店舗別の商品在庫を管理せよ」

    あなたは、複数の店舗における商品の在庫情報を管理しています。
    構造としては、次のように Mapの中にMap がある形です:

    • 店舗名(String) → 商品名(String) → 在庫数(Integer)

    次のデータをMapに登録し、すべての情報を出力してください:

    • “Tokyo” 店
    • “Apple” → 10
    • “Banana” → 5
    • “Osaka” 店
    • “Apple” → 7
    • “Orange” → 3

    出力形式(順不同):

    Tokyo:
    Apple → 10
    Banana → 5
    Osaka:
    Apple → 7
    Orange → 3

    要件

    • Map<String, Map<String, Integer>> を使うこと
    • データを登録する際、ネストされたMapを初期化してから使うこと
    • for 文で2重ループしてすべてのデータを出力すること

    テストコード(Main.java)

    public class Main {
        public static void main(String[] args) {
            MapUtil.printStoreInventory();
        }
    }

    ヒント

    • 最初に containsKey() で店舗(外側のMap)をチェック
    • 店舗Mapがなければ new HashMap<>() を使って初期化
    • 出力は「外側のMap → 内側のMap」の2重ループになる

    →解答例

    102 ステップアップ問題 「Map修羅道」

    🎯 実習で理解を深めよう

    この内容についてJavaDrillで実際に手を動かして学習できます

    ]]>
    https://minner.asia/archives/4980/feed 0
    102 「Map修羅道」 Step06 解答例 https://minner.asia/archives/4975 https://minner.asia/archives/4975#respond Mon, 19 May 2025 00:47:06 +0000 http://localhost/?p=4975

    MapUtil.java

    import java.util.*;
    
    public class MapUtil {
        public static void findProductIdByName() {
            // 商品IDと商品名の対応を記録するMapを作成
            Map<Integer, String> productMap = new HashMap<>();
            productMap.put(101, "Apple");
            productMap.put(102, "Banana");
            productMap.put(103, "Orange");
    
            // 検索対象の商品名
            String targetName = "Banana";
    
            // フラグと結果変数を用意
            boolean found = false;
            int foundId = -1;
    
            // Mapをループして、valueからkeyを探す
            for (Map.Entry<Integer, String> entry : productMap.entrySet()) {
                Integer id = entry.getKey();
                String name = entry.getValue();
    
                // 値(商品名)が一致したら
                if (name.equals(targetName)) {
                    found = true;
                    foundId = id;
                    break; // 見つかったらループ終了
                }
            }
    
            // 結果の出力
            System.out.println("商品名: " + targetName);
            if (found) {
                System.out.println("商品ID: " + foundId);
            } else {
                System.out.println("見つかりませんでした");
            }
        }
    }

    解説:「Mapは値で検索できない」ってどういうこと?

    Mapの基本は「キー → 値」です。
    つまり、「IDから名前を引く」のは得意ですが、「名前からIDを探す」のは得意ではありません。


    なぜ苦手なのか?

    Mapはキーに対してハッシュテーブルやツリー構造を構築していますが、
    値に関しては何のインデックスも持たないからです。

    そのため、値からキーを探すには、全件ループして1件ずつ比較するしかありません。


    書き方のポイント

    for (Map.Entry<Integer, String> entry : map.entrySet()) {
        if (entry.getValue().equals(target)) {
            // 一致したらentry.getKey()が目的のID
        }
    }
    • equals() で文字列の比較
    • 見つかった時点で break すると効率が良い
    • 見つからなかった場合の処理も忘れずに

    containsValue() では足りない理由

    map.containsValue("Banana"); // true/false しか返さない
    • このメソッドでは 「値が存在するかどうか」 はわかるが、「どのキーか」 はわからない
    • 結局ループが必要になる

    実行結果の例

    商品名: Banana
    商品ID: 102

    まとめ:このステップで学ぶべきこと

    • Mapは「キーから値」は得意でも「値からキー」は苦手
    • 値からキーを探すには、全件ループして比較する必要がある
    • 検索効率を求めるなら「逆向きのMap」を別途用意する方法もある(応用)

    このステップでMapの「片方向性」を知っておくことは、設計ミスを防ぐうえでとても重要です。

    102 ステップアップ問題 「Map修羅道」


    Just Keep Typing, Baby!では、この「Map修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!

    // tesh:
    // このへん曖昧なままだと、痛い目みるぞ。

    🎯 実習で理解を深めよう

    この内容についてJavaDrillで実際に手を動かして学習できます

    ]]>
    https://minner.asia/archives/4975/feed 0
    102 「Map修羅道」 Step06 問題 https://minner.asia/archives/4972 https://minner.asia/archives/4972#respond Mon, 19 May 2025 00:41:33 +0000 http://localhost/?p=4972

    「この商品ID、何て名前?」

    あなたは、商品IDと商品名の対応を Map<Integer, String> で管理しています。
    Mapに次のデータを登録し、その後、「ある商品名」がMap内に存在するかを判定し、そのIDを出力してください。

    登録データ:

    • 101 → “Apple”
    • 102 → “Banana”
    • 103 → “Orange”

    検索対象の商品名(固定):”Banana”

    出力例:

    商品名: Banana
    商品ID: 102

    要件

    • Map<Integer, String> を使用すること(キーがID)
    • 値からキーを探す処理を自力で書くこと(Mapは値からの検索に最適化されていない)
    • Mapをループ処理して値を見つけたら、対応するキーを出力すること
    • 値が見つからなかった場合は「見つかりませんでした」と表示すること

    テストコード(Main.java)

    public class Main {
        public static void main(String[] args) {
            MapUtil.findProductIdByName();
        }
    }

    ヒント

    • map.containsValue("Banana") というメソッドはあるが、値に対応するキーを取るにはループが必要
    • entrySet() で key と value を両方同時に扱える

    →解答例

    102 ステップアップ問題 「Map修羅道」

    🎯 実習で理解を深めよう

    この内容についてJavaDrillで実際に手を動かして学習できます

    ]]>
    https://minner.asia/archives/4972/feed 0