Java | 1 日 90 分 × 7 日アプリ学習 初級編:Map を使うアプリ

Web APP Java
スポンサーリンク

1日目のゴール

1日目のテーマは
「Map=“キーと値のペアを覚えておくノート”という感覚をつかむこと」 です。

今日はまだ、HashMap の細かいメソッドを全部覚える日ではありません。
まずは頭の中に、

「キー(key)=“呼び名・ラベル”」
「値(value)=“本当に知りたい中身”」

というイメージを、しっかり作るのがゴールです。


配列・List と Map の決定的な違い

配列・List は「番号で取り出す」

これまでやってきた 配列ArrayList は、
どちらも「番号(インデックス)」で取り出していました。

String[] names = new String[3];
names[0] = "山田";
names[1] = "佐藤";
names[2] = "鈴木";

System.out.println(names[1]); // 佐藤
Java
ArrayList<String> names = new ArrayList<>();
names.add("山田");
names.add("佐藤");
names.add("鈴木");

System.out.println(names.get(1)); // 佐藤
Java

ここで使っているのは「0, 1, 2…」という番号です。

配列・List の世界では、

「0番目」「1番目」「2番目」

という“位置”がとても重要でした。

Map は「番号ではなく“名前”で取り出す」

一方、Map はこういう世界です。

「会員番号 1234 の人の名前は?」
「国コード JP の国名は?」
「ユーザーID user01 のメールアドレスは?」

つまり、

「何かの“名前(キー)”から、“対応する情報(値)”を取り出す」

という使い方をします。

番号ではなく、「意味のあるキー」で取り出す。
ここが、Map の一番大きな特徴です。


key / value を“現実の例”でイメージする

電話帳のイメージ

一番わかりやすいのは「電話帳」です。

  • 名前 → 電話番号
  • 「山田太郎」 → “090-xxxx-xxxx”
  • 「佐藤花子」 → “080-xxxx-xxxx”

このとき、

「名前」が key
「電話番号」が value

です。

「山田太郎の電話番号を教えて」
という問いに対して、
電話帳は「山田太郎」というキーから、
対応する電話番号(値)を探してくれます。

国コードのイメージ

もうひとつ、よくある例。

  • “JP” → “Japan”
  • “US” → “United States”
  • “FR” → “France”

このとき、

“JP” や “US” が key
“Japan” や “United States” が value

です。

「JP ってどこの国?」
と聞かれたら、
“JP” というキーから “Japan” という値を取り出します。


Java の Map を最初の一歩だけ触ってみる

HashMap を使った超シンプルな例

1日目は、HashMap という代表的な Map を使ってみます。

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, String> phoneBook = new HashMap<>();

        phoneBook.put("山田太郎", "090-1111-2222");
        phoneBook.put("佐藤花子", "080-3333-4444");

        String yamada = phoneBook.get("山田太郎");
        System.out.println("山田太郎の電話番号: " + yamada);

        String suzuki = phoneBook.get("鈴木一郎");
        System.out.println("鈴木一郎の電話番号: " + suzuki);
    }
}
Java

ここで出てきた新しいものを、ゆっくり分解します。

Map<String, String> の意味

Map<String, String> phoneBook = new HashMap<>();
Java

これは、

「キーが String、値も String の Map」

という意味です。

今回の例では、

キー:名前(String)
値:電話番号(String)

なので、Map<String, String> になっています。

もし、

キー:会員番号(String)
値:User クラス

なら、Map<String, User> になります。

「Map<キーの型, 値の型>」
という形で、何と何を対応させるかを表します。

put(key, value) で「登録」する

phoneBook.put("山田太郎", "090-1111-2222");
phoneBook.put("佐藤花子", "080-3333-4444");
Java

put は、

「このキーには、この値を対応させて覚えておいて」

という命令です。

「山田太郎」 → “090-1111-2222”
「佐藤花子」 → “080-3333-4444”

という対応関係が、Map の中に保存されます。

get(key) で「取り出す」

String yamada = phoneBook.get("山田太郎");
Java

get("山田太郎") は、

「キーが ‘山田太郎’ のときの値を教えて」

という意味です。

さっき put で登録したので、
“090-1111-2222” が返ってきます。

一方で、登録していないキーを指定するとどうなるか。

String suzuki = phoneBook.get("鈴木一郎");
System.out.println(suzuki);
Java

この場合、null が返ってきます。
「そのキーは登録されていない」という意味です。


key / value の“ルール”をしっかり理解する

重要ポイント1:キーは「重複しない」

Map では、
「同じキーは1つだけ」
というルールがあります。

次のコードを見てください。

Map<String, String> phoneBook = new HashMap<>();

phoneBook.put("山田太郎", "090-1111-2222");
phoneBook.put("山田太郎", "080-5555-6666");

String yamada = phoneBook.get("山田太郎");
System.out.println(yamada);
Java

このとき、出力されるのは "080-5555-6666" です。

2回目の put が、
1回目の値を「上書き」してしまうからです。

つまり、

キーは「一意(ユニーク)」
同じキーに対しては、最後に入れた値が有効

というルールになっています。

ここが、List と大きく違うところです。

重要ポイント2:値は「重複してもいい」

一方、値は重複してもかまいません。

phoneBook.put("山田太郎", "090-1111-2222");
phoneBook.put("佐藤花子", "090-1111-2222");
Java

このように、

「違うキーが、同じ値を指している」

という状態はOKです。

「キーは一意、値は重複OK」

このセットは、必ず覚えておいてください。


Map が活きる場面をイメージでつかむ

「番号で覚えるより、名前で覚えたい」場面

List だと、こうなります。

ArrayList<String> names = new ArrayList<>();
names.add("山田太郎");   // 0
names.add("佐藤花子");   // 1

// 「佐藤花子は何番目だっけ?」と考えないといけない
System.out.println(names.get(1));
Java

「1番目」という情報を、
自分で覚えておく必要があります。

一方、Map ならこうです。

Map<String, String> phoneBook = new HashMap<>();
phoneBook.put("山田太郎", "090-1111-2222");
phoneBook.put("佐藤花子", "080-3333-4444");

System.out.println(phoneBook.get("佐藤花子"));
Java

「佐藤花子」という名前(キー)さえ分かれば、
番号を意識せずに、対応する値を取り出せます。

「番号で覚えるのはつらい。名前で覚えたい」
という場面で、Map は真価を発揮します。


1日目のミニアプリ:国コード辞書

仕様を言葉で決める

小さな「国コード辞書アプリ」を作ってみます。

“JP” と入れたら “Japan” と出る
“US” と入れたら “United States” と出る
登録されていないコードなら「登録されていません」と出る

今日は入力は固定にして、
Map の感覚に集中します。

コード全体

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, String> countries = new HashMap<>();

        countries.put("JP", "Japan");
        countries.put("US", "United States");
        countries.put("FR", "France");

        showCountryName(countries, "JP");
        showCountryName(countries, "US");
        showCountryName(countries, "CN");
    }

    static void showCountryName(Map<String, String> map, String code) {
        String name = map.get(code);
        if (name == null) {
            System.out.println(code + " は登録されていません。");
        } else {
            System.out.println(code + " → " + name);
        }
    }
}
Java

ここで感じてほしいのは、次の3つです。

“JP” というキーから “Japan” という値を取り出している
登録されていないキー(”CN”)は null になるので、自分で判定している
「キーが分かれば、値に一瞬でたどり着ける」感覚


今日いちばん大事な“頭の中のイメージ”

1日目で絶対に持って帰ってほしいのは、このイメージです。

Map のイメージ

「キーと値のペアを覚えておくノート」
「キーはラベル・名前・ID」
「値は本当に知りたい中身」
「キーは一意(同じキーは1つだけ)」
「値は重複してもいい」
put(key, value) で登録」
get(key) で取り出し」
「登録されていないキーは null が返る」

そしてもうひとつ。

「List は“番号で取り出す集まり”、Map は“名前で取り出す集まり”」

この対比が、頭の中でハッキリしていれば、
1日目としては大成功です。

2日目以降は、

キーの一覧を回す
Map と List を組み合わせる
オブジェクトを値にする(Map<String, User> など)

といった、より“アプリっぽい”使い方に踏み込んでいきます。

タイトルとURLをコピーしました