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

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:Map

この記事の練習問題を解くために必要な知識:
基礎文法、制御構造、関数(レッスン1~3)、配列ListSetMapコレクション操作コレクションとジェネリクス

<<前のページ Kotlin記事一覧 次のページ>>

Kotlinの「Map」とは

この章ではKotlinにおける「Map」の意味や使い方を学習します。用語の解説が不要な方はここをクリックして練習問題へ飛びましょう。




KotlinのMapはキーと値のペアを管理するデータ構造です。

この章ではMapの基本的な使い方と操作方法を学びます。

Mapとは?

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

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

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

Mapの基本構文

KotlinではMapOfmutableMapOfを使用してMapを作成します。

MapOfは読み取り専用のMapを作成し、mutableMapOfは変更可能なMapを作成します。

// 読み取り専用のMap
val readOnlyMap = mapOf(1 to "One", 2 to "Two", 3 to "Three")

// 変更可能なMap
val mutableMap = mutableMapOf(1 to "One", 2 to "Two")

mapOfではto演算子を使用してキーと値をペアとして指定します。

一方mutableMapOfでは要素の追加や削除も可能です。

Mapの使用例

以下にMapの基本的な使用例を示します。

fun main() {
    // Mapの作成
    val fruits = mapOf("Apple" to 100, "Banana" to 50, "Cherry" to 200)
    val mutableFruits = mutableMapOf("Apple" to 100, "Banana" to 50)

    // 値の取得
    println(fruits["Apple"]) // 出力: 100

    // 要素の追加(変更可能なMap)
    mutableFruits["Cherry"] = 200
    println(mutableFruits) // 出力: {Apple=100, Banana=50, Cherry=200}

    // 要素の削除(変更可能なMap)
    mutableFruits.remove("Banana")
    println(mutableFruits) // 出力: {Apple=100, Cherry=200}
}

このコードではmapOfを用いてキーと値のペアを作成し、mutableMapOfで要素を追加・削除しています。

Mapを操作する方法

変更可能なMapには、要素を操作するための便利なメソッドが用意されています。

要素の追加:

putメソッドまたはインデックス演算子([])を使用します。

mutableMap.put("Grape", 300)
mutableMap["Peach"] = 150

要素の取得:

キーを使用して値を取得します。

val price = mutableMap["Apple"]
println(price) // 出力: 100

要素の削除:

removeメソッドを使用します。

mutableMap.remove("Apple")

繰り返し処理:

Mapのすべての要素を反復処理することもできます。

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

まとめ

Kotlinの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からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

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

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

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

ヒント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")
    }
}

以上がこの問題の穴埋めコードです。

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



練習問題の解答と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

// メイン関数
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")
    }
}

正解コードの解説

今回のコードではKotlinの「Map」を中心に商品と価格を管理する方法を学びます。

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

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を表示します。

まとめ

このコードではKotlinのMapの基本的な使い方(初期化、要素の追加、更新、削除、検索)を学びました。

Mapはデータをキーと値のペアで管理する際に非常に便利なデータ構造です。

この練習を通じてMapを操作する力を身につけ、さらに複雑なデータ管理にも挑戦してみてください!

<<前のページ Kotlin記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Kotlinのテキスト&問題集トップへ戻る
    トップページへ戻る