【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
は変更可能なミュータブルマップを作成します。
例えば、スーパーで売られているフルーツの値段と在庫数をそれぞれのマップで管理するコードを考えてみましょう。
商品の値段(変更不可)
キー | 値 |
---|---|
Apple | 120 |
Banana | 80 |
在庫数(変更可能)
キー | 値 |
---|---|
Apple | 50 |
Banana | 30 |
このようなマップを作成するには、以下のように記述します。
// 読み取り専用の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を使って商品名をキー、価格を値として登録します。
登録された商品を表示し、新しい商品を追加したり、価格を更新したり、特定の商品を削除したりします。
また指定された商品がリストに存在するか確認できるようにします。
この問題の要件
以下の要件に従ってコードを完成させてください。
- 商品名をキー、価格を値とする
productPrices
というMapを作成すること。- りんご:120円
- バナナ:100円
- オレンジ:150円
- Mapの内容を表示する処理を作成すること。
- 以下の機能を実装すること。
- ユーザーに商品名を入力させ、入力された商品の価格を表示する。商品が存在しない場合はその旨を表示する。
- Mapに新しい商品「ぶどう:200円」を追加する。
- 「バナナ」の価格を110円に更新する。
- 「オレンジ」をMapから削除する。
- 更新後の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") } }
- 正解コードの解説
-
コードをブロックごとに分割して解説します。
Mapの初期化
val productPrices = mutableMapOf( "りんご" to 120, "バナナ" to 100, "オレンジ" to 150 )
mutableMapOf
: 変更可能なMapを作成するための関数です。- ここでは商品名(キー)と価格(値)のペアをMapとして初期化しています。
"りんご" to 120
のようにto
を使ってキーと値のペアを作ります。
- Mapの用途: データをキーと値の組み合わせで効率的に管理できます。
Mapの内容を表示
for ((product, price) in productPrices) { println("$product : ¥$price") }
for ((key, value) in map)
: Mapの各要素を繰り返し処理する方法です。- キーと値がそれぞれ
product
とprice
に割り当てられます。 - この部分で現在のMapに含まれる商品と価格を全て表示します。
商品の検索
val input = readLine() ?: "" if (productPrices.containsKey(input)) { println("$input の価格は ¥${productPrices[input]} です") } else { println("$input はリストにありません") }
readLine()
: ユーザーの入力を取得します。containsKey
: 指定したキーがMapに含まれているかを確認します。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を表示します。
- サイト改善アンケート & ご指摘/ご質問
-
本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などを アンケート 形式でお伺いしています。また記事の内容に関する ご指摘 や ご質問 もお待ちしています。