【Kotlin】レッスン4-4:Mapを理解しよう

ながみえ

一つ前のページではSet(集合)について学習しました。

今回は Map について見ていきましょう。

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数編
Lesson4:コレクション編

 ・Lesson4-1:配列を理解しよう
 ・Lesson4-2:Listを理解しよう
 ・Lesson4-3:Setを理解しよう
 ・Lesson4-4:Mapを理解しよう ◁今回はココ
 ・Lesson4-5:コレクションを使いこなそう
 ・Lesson4-6:コレクションとジェネリクスを組み合わせよう
 ・確認問題4-☆1:ナインゲームを作ろう
 ・確認問題4-☆2:アラビア数字をローマ数字に変換しよう
 ・確認問題4-☆3:宝探しゲームを作ろう
Lesson5:オブジェクト指向編

<<前のページ

学習記事一覧

次のページ>>

Mapとは何か|keyとvalueで管理するコレクション型

Map(マップ)は、「キー(key)」と「値(value)」のセットを複数保存できるコレクション型です。

たとえば、「名前→年齢」や「ID→商品名」のように、何かを別の何かに対応付けたいときに使います。

今回はのこMapについて詳しく学習していきましょう。

Mapの概要|ImmutableMapとmutableMapの違い

Map はキー(key)と値(value)のペアで構成されるコレクションです。

例えばユーザーIDをキーにして名前を値として保持する場合などに使用されます。

ユーザーID(key)名前(value)
0001山田 太郎
0002田中 花子
0003鈴木 一郎

Mapはキーを用いて効率的に値を検索できるため、データを迅速に操作する必要がある場面で非常に有用です。

リストやセット(集合)と同様に、マップにも「作成後に要素の変更ができないイミュータブルマップ」と、「変更可能な ミュータブルマップ」の2種類があります。

Mapの作成方法|to演算子によるkeyとvalueの紐付け

マップを作成するには MapOf関数mutableMapOf関数 を使用します。

MapOfは読み取り専用のイミュータブルマップを作成し、mutableMapOfは変更可能なミュータブルマップを作成します。

例えば、スーパーで売られているフルーツの値段と在庫数をそれぞれのマップで管理するコードを考えてみましょう。

商品の値段(変更不可)

キー
Apple120
Banana80

在庫数(変更可能)

キー
Apple50
Banana30

このようなマップを作成するには、以下のように記述します。

// 読み取り専用のMap:商品の値段
val price = mapOf("Apple" to 120, "Banana" to 80)

// 変更可能なMap:商品の在庫数
val stock = mutableMapOf("Apple" to 50, "Banana" to 30)

Map作成時は to演算子 を使用してキーと値をペアとして指定します。

Mapの使用例|データの取得・追加・削除

インデックス演算子[]putメソッドremoveメソッド を使用し、Mapを操作するコード例を以下にしまします。

fun main() {
    // Mapの作成
    val price = mapOf("Apple" to 120, "Banana" to 80)		// 変更不可マップ
    val stock = mutableMapOf("Apple" to 50, "Banana" to 30)	// 変更可能マップ

    // 値の取得
    println(price["Apple"]) 	// キーを指定して値を取得して出力:120

    // 要素の変更・追加
    stock["Apple"] = 30			// インデックス演算子でキーを指定して値を変更
    stock["Strawberry"] = 100	// インデックス演算子でキーと値を追加
    stock.put("Grape", 300)		// putメソッドでキーと値を追加
    println(stock)				// 出力: {Apple=30, Banana=30, Strawberry=100, Grape=300}

    // 要素の削除
    stock.remove("Banana")		// removeメソッドでキーを指定して要素を削除
    println(stock)				// 出力: {Apple=30, Strawberry=100, Grape=300}
}

また、Mapは繰り返し処理の中で使用することもできます。

上記のコードの最後に以下のコードを追加し、動作を確認してみましょう。

for ((key, value) in price) {
    println("$key costs $value")
}

まとめ|Mapを使いこなそう

Mapは「キー」と「値」の組み合わせでデータを効率よく管理できる便利なコレクションです。

今回紹介したように、値の取得や追加・変更・削除が直感的に行えるため、日常のプログラムから本格的なアプリ開発まで幅広く活用できます。

ぜひ、Mapの特徴を活かして、より柔軟で見通しの良いコードを書いてみてください!

練習問題|Mapを使って商品と価格を管理しよう

商品とその価格を管理するプログラムを作成しましょう。

このプログラムではMapを使って商品名をキー、価格を値として登録します。

登録された商品を表示し、新しい商品を追加したり、価格を更新したり、特定の商品を削除したりします。

また指定された商品がリストに存在するか確認できるようにします。

この問題の要件

以下の要件に従ってコードを完成させてください。

  1. 商品名をキー、価格を値とするproductPricesというMapを作成すること。
    • りんご:120円
    • バナナ:100円
    • オレンジ:150円
  2. Mapの内容を表示する処理を作成すること。
  3. 以下の機能を実装すること。
    • ユーザーに商品名を入力させ、入力された商品の価格を表示する。商品が存在しない場合はその旨を表示する。
    • Mapに新しい商品「ぶどう:200円」を追加する。
    • 「バナナ」の価格を110円に更新する。
    • 「オレンジ」をMapから削除する。
  4. 更新後のMapの内容を再度表示すること。

ただし、以下のような実行結果となること。

現在の商品リスト:
りんご : ¥120
バナナ : ¥100
オレンジ : ¥150

商品名を入力してください(例: りんご):
りんご
りんご の価格は ¥120 です

新しい商品を追加します...
ぶどう がリストに追加されました

商品の価格を更新します...
バナナの価格が更新されました!

商品を削除します...
オレンジ がリストから削除されました

更新後の商品リスト:
りんご : ¥120
バナナ : ¥110
ぶどう : ¥200

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:メイン関数の定義
  □ 変数productPricesをmutableMapOfで初期化
  □ □ キーに「りんご」、値に120を設定
  □ □ キーに「バナナ」、値に100を設定
  □ □ キーに「オレンジ」、値に150を設定
  □ 「現在の商品リスト:」を出力
  □ for文でproductPricesのキーと値を繰り返し処理
  □ □ 「商品名 : 価格」の形式で出力
  □ 「商品名を入力してください(例: りんご)」を出力
  □ readLineで入力を受け取り、変数inputに格納
  □ if文でinputがproductPricesに含まれているか判定
  □ □ 真の場合、「商品名 の価格は ¥価格」を出力
  □ □ elseブロック
  □ □ □ 偽の場合、「商品名 はリストにありません」と出力
  □ 「新しい商品を追加します…」を出力
  □ Mapに新しい商品「ぶどう」と価格200を追加
  □ 「ぶどう がリストに追加されました」を出力
  □ 「商品の価格を更新します…」を出力
  □ if文で「バナナ」がproductPricesに含まれているか判定
  □ □ 真の場合、価格を110に更新
  □ □ 「バナナの価格が更新されました!」を出力
  □ 「商品を削除します…」を出力
  □ Mapから「オレンジ」を削除
  □ 「オレンジ がリストから削除されました」を出力
  □ 「更新後の商品リスト:」を出力
  □ for文で更新後のproductPricesを繰り返し処理
  □ □ 「商品名 : 価格」の形式で出力

Q
ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

// メイン関数
fun main() {
    // 商品名をキー、価格を値として保持するMap
    /*【穴埋め問題1】
    ここでmutableMapOfを使用して、キーとして商品名、値として価格を保持するMapを初期化するコードを書いてください。
    */

    // Mapの内容を表示
    println("現在の商品リスト:")
    for ((product, price) in productPrices) {
        println("$product : ¥$price")
    }

    // 商品の価格を検索
    println("\n商品名を入力してください(例: りんご):")
    /*【穴埋め問題2】
    ここでreadLine()を使用してユーザー入力を受け取り、変数inputに格納するコードを書いてください。
    */

    if (productPrices.containsKey(input)) {
        println("$input の価格は ¥${productPrices[input]} です")
    } else {
        println("$input はリストにありません")
    }

    // 商品の追加
    println("\n新しい商品を追加します...")
    /*【穴埋め問題3】
    ここで新しい商品をMapに追加するコードを書いてください。
    */

    println("ぶどう がリストに追加されました")

    // 商品価格の更新
    println("\n商品の価格を更新します...")
    /*【穴埋め問題4】
    ここでMap内の商品の価格を更新するコードを書いてください。
    */

    println("バナナの価格が更新されました!")

    // 商品の削除
    println("\n商品を削除します...")
    /*【穴埋め問題5】
    ここでMapから指定された商品を削除するコードを書いてください。
    */

    println("オレンジ がリストから削除されました")

    // 更新後のMapの内容を表示
    println("\n更新後の商品リスト:")
    for ((product, price) in productPrices) {
        println("$product : ¥$price")
    }
}

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

この問題の解答と解説

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
// メイン関数
fun main() {
    // 商品名をキー、価格を値として保持するMap
    val productPrices = mutableMapOf(
        "りんご" to 120,
        "バナナ" to 100,
        "オレンジ" to 150
    )

    // Mapの内容を表示
    println("現在の商品リスト:")
    for ((product, price) in productPrices) {
        println("$product : ¥$price")
    }

    // 商品の価格を検索
    println("\n商品名を入力してください(例: りんご):")
    val input = readLine() ?: ""
    if (productPrices.containsKey(input)) {
        println("$input の価格は ¥${productPrices[input]} です")
    } else {
        println("$input はリストにありません")
    }

    // 商品の追加
    println("\n新しい商品を追加します...")
    productPrices["ぶどう"] = 200
    println("ぶどう がリストに追加されました")

    // 商品価格の更新
    println("\n商品の価格を更新します...")
    if (productPrices.containsKey("バナナ")) {
        productPrices["バナナ"] = 110
        println("バナナの価格が更新されました!")
    }

    // 商品の削除
    println("\n商品を削除します...")
    productPrices.remove("オレンジ")
    println("オレンジ がリストから削除されました")

    // 更新後のMapの内容を表示
    println("\n更新後の商品リスト:")
    for ((product, price) in productPrices) {
        println("$product : ¥$price")
    }
}
Q
正解コードの解説

コードをブロックごとに分割して解説します。

Mapの初期化

val productPrices = mutableMapOf(
    "りんご" to 120,
    "バナナ" to 100,
    "オレンジ" to 150
)
  1. mutableMapOf: 変更可能なMapを作成するための関数です。
    • ここでは商品名(キー)と価格(値)のペアをMapとして初期化しています。
    • "りんご" to 120 のようにtoを使ってキーと値のペアを作ります。
  2. Mapの用途: データをキーと値の組み合わせで効率的に管理できます。

Mapの内容を表示

for ((product, price) in productPrices) {
    println("$product : ¥$price")
}

for ((key, value) in map): Mapの各要素を繰り返し処理する方法です。

  • キーと値がそれぞれproductpriceに割り当てられます。
  • この部分で現在のMapに含まれる商品と価格を全て表示します。

商品の検索

val input = readLine() ?: ""
if (productPrices.containsKey(input)) {
    println("$input の価格は ¥${productPrices[input]} です")
} else {
    println("$input はリストにありません")
}
  1. readLine(): ユーザーの入力を取得します。
  2. containsKey: 指定したキーがMapに含まれているかを確認します。
  3. map[key]: キーに対応する値を取得します。存在しない場合はnullを返します。
    • この部分では、ユーザーが入力した商品名の価格を検索して表示します。

商品の追加

productPrices["ぶどう"] = 200
println("ぶどう がリストに追加されました")

map[key] = value: Mapに新しいキーと値を追加します。

キーが既に存在する場合は値を更新します。

商品の価格を更新

productPrices["バナナ"] = 110
println("バナナの価格が更新されました!")

キーが既存の場合: 上記のようにmap[key] = valueを使用することで値を更新できます。

商品の削除

productPrices.remove("オレンジ")
println("オレンジ がリストから削除されました")

remove(key): 指定したキーと対応する値をMapから削除します。

更新後のMapの内容を表示

for ((product, price) in productPrices) {
    println("$product : ¥$price")
}

前述の内容表示部分と同様のコードを再利用して、更新後のMapを表示します。

Q
サイト改善アンケート & ご指摘/ご質問

本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などを アンケート 形式でお伺いしています。

また記事の内容に関する ご指摘ご質問 もお待ちしています。

1.このサイトをどのように活用していますか?また、今後どのように活用したいですか?
5.気になっているサービス・商品があれば教えてください。
※ 特定の記事に関する内容の場合は、記事番号(レッスン〇-〇)をご記入願います。

<<前のページ

学習記事一覧

次のページ>>

記事URLをコピーしました