Kotlin練習問題3-5:MutableSetとMutableMapを使いこなそう

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

Kotlinの初心者向け問題3-5:MutableSetとMutableMapを使いこなそう

この問題を解くために必要な知識:

【レベル1~2の知識】
コメントの書き方、変数と定数、基本データ型、算術演算と論理演算、入力と出力、import文、配列、分岐処理(if、if~else、when)、繰り返し処理(for、while、do~while)、Null安全、スマートキャスト、関数の定義と呼び出し、関数の戻り値、関数のオーバーロード、ラベルとジャンプ、例外処理、クラスの定義と使用、インスタンス、コンストラクタ、プロパティ、クラスの継承、クラスの拡張

【レベル4の知識】
コレクションの基礎、リストコレクション(MutableList、ArrayList)、セットコレクション(HashSet、MutableSet、TreeSet)、マップコレクション(HashMap、MutableMap、TreeMap)

<<前の問題 問題集Top 次の問題>>

Kotlinの文法「MutableSetとMutableMap」とは

ここではMutableSetとMutableMapの意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。



Kotlinでは、MutableSetとMutableMapというコレクション型を使って、データを柔軟に管理することができます。

これらはどちらも変更可能なコレクションで、必要に応じて要素を追加、削除、更新することができます。

この記事では、それぞれの特徴や使用方法について解説します。

MutableSetとは?

MutableSetは、重複する要素を持たないコレクションです。

Setと違い、MutableSetは作成後に要素を追加・削除することが可能です。主に、ユニークな要素を管理する場面で活躍します。

val mutableSet = mutableSetOf("apple", "banana", "orange")
// 要素の追加
mutableSet.add("grape")
// 要素の削除
mutableSet.remove("banana")

println(mutableSet) // [apple, orange, grape]

上記のコードでは、”banana”を削除し、”grape”を追加しています。

MutableSetは重複する要素を許さないため、同じ要素を複数回追加しようとすると無視されます。

MutableSetの使用例

例えば、ユーザーの選んだオプションをユニークに管理したい場合などにMutableSetは有用です。

以下の例では、ユーザーが選んだフルーツを管理し、重複した選択が追加されないことを示しています。

val selectedFruits = mutableSetOf<String>()

// ユーザーがフルーツを選択する
selectedFruits.add("apple")
selectedFruits.add("banana")
selectedFruits.add("apple") // "apple"は既に追加されているため無視される

println(selectedFruits) // [apple, banana]

MutableMapとは?

MutableMapは、キーと値のペアを管理するコレクションです。

キーを使って効率的にデータを取得したり、更新したりすることができます。

MutableSetと同様に、MutableMapも作成後に要素を変更することができます。

val mutableMap = mutableMapOf("apple" to 1, "banana" to 2)
// 要素の追加
mutableMap["orange"] = 3
// 要素の更新
mutableMap["apple"] = 4

println(mutableMap) // {apple=4, banana=2, orange=3}

このコードでは、”apple”の値が更新され、新しいキー”orange”が追加されています。

MutableMapではキーがユニークである必要があるため、同じキーで値を再度設定するとその値が更新されます。

MutableMapの使用例

MutableMapは、例えば商品の在庫管理などに役立ちます。以下の例では、フルーツの名前をキーにして在庫数を管理しています。

val stock = mutableMapOf("apple" to 10, "banana" to 5)

// 在庫を追加
stock["orange"] = 8
// 在庫を更新
stock["apple"] = 15

println(stock) // {apple=15, banana=5, orange=8}

このように、MutableMapを使うことで、キーを元にデータを柔軟に操作することができます。

MutableSetとMutableMapの使い分け

MutableSetとMutableMapはどちらもコレクションですが、用途が異なります。

MutableSetは一意な要素を持つリストを管理したいときに使い、MutableMapはキーと値のペアを効率的に管理したいときに使います。

例えば、ユニークなIDの一覧を保持する場合はMutableSetが適しており、ユーザーIDとユーザー名の対応を管理する場合はMutableMapが有効です。

まとめ

KotlinのMutableSetとMutableMapは、データを効率的かつ柔軟に管理できる強力なツールです。

それぞれの特徴を理解し、適切な場面で使い分けることで、より簡潔で効率的なコードを書くことができます。ぜひ、実際のプロジェクトで活用してみてください。




Kotlin練習問題3-5:MutableSetとMutableMapを使いこなそう

ユーザーからフルーツの名前と価格を入力して管理するプログラムを作成しましょう。

このプログラムでは、ユーザーが入力したフルーツの名前と価格を保存し、すべてのフルーツの情報を表示する機能を持ちます。

また、特定のフルーツの価格を確認する機能も実装します。

この問題の要件

以下のの要件を満たすプログラムを作成してください。

  • フルーツの名前を格納するためのMutableSetを作成すること。
  • フルーツの名前と価格を格納するためのMutableMapを作成すること。
  • ユーザーがフルーツの名前と価格を入力できるようにすること。名前が「終了」と入力された場合、入力を終了すること。
  • フルーツの名前がすでに存在する場合、その価格を更新すること。存在しない場合は新しく追加すること。
  • すべてのフルーツの名前と価格を表示する関数を作成すること。
  • 特定のフルーツの価格を確認できるようにすること。

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

----- ↓出力される結果の例↓ -----

フルーツの名前を入力してください (終了するには「終了」と入力): りんご
りんご の価格を入力してください: 150
りんご が追加されました。
フルーツの名前を入力してください (終了するには「終了」と入力): バナナ
バナナ の価格を入力してください: 100
バナナ が追加されました。
フルーツの名前を入力してください (終了するには「終了」と入力): りんご
りんご の価格を入力してください: 160
りんご の価格が更新されました。
フルーツの名前を入力してください (終了するには「終了」と入力): 終了
全てのフルーツの名前と価格:
りんご の価格は 160 円です。
バナナ の価格は 100 円です。
価格を確認したいフルーツの名前を入力してください: りんご
りんご の価格は 160 円です。

----- ↑出力される結果の例↑ -----

この問題を解くヒント

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

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

正解のコードは上から順に以下のような構成となっています。

1.main関数の定義
 1-1. MutableSetの作成(fruitSet)
 1-2. MutableMapの作成(fruitMap)
 1-3. ユーザー入力ループ(while文)
  1-3-1. フルーツの名前を入力
  1-3-2. 入力終了の条件チェック(if文)
  1-3-3. フルーツの価格を入力
  1-3-4. フルーツの名前がセットに存在するか確認(if文)
   1-3-4-1. 存在する場合は価格を更新(fruitMapの更新)
   1-3-4-2. 存在しない場合は新しく追加(fruitSetとfruitMapに追加)
 1-4. 全てのフルーツの名前と価格を表示(printFruitDetails関数の呼び出し)
 1-5. 特定のフルーツの価格を確認(when文)
2.printFruitDetails関数の定義
 2-1. forループで全てのフルーツの名前と価格を表示

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

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

fun main() {
    // フルーツの名前を格納する**MutableSet**を作成
    val fruitSet = /* @@@ここにMutableSetを初期化するコードを書いてください@@@ */

    // フルーツの名前と価格を格納する**MutableMap**を作成
    val fruitMap = /* @@@ここにMutableMapを初期化するコードを書いてください@@@ */

    // ユーザーにフルーツの情報を入力してもらう
    while (true) {
        print("フルーツの名前を入力してください (終了するには「終了」と入力): ")
        val name = /* @@@ここにユーザーから入力を受け取るコードを書いてください@@@ */
        if (name == "終了") break
        print("$name の価格を入力してください: ")
        val price = /* @@@ここに価格を入力するコードを書いてください@@@ */

        // フルーツの名前がセットに存在するか確認
        if (/* @@@ここにセットに名前が含まれているかを確認するコードを書いてください@@@ */) {
            // 存在する場合は価格を更新
            fruitMap[name] = /* @@@ここに価格を更新するコードを書いてください@@@ */
            println("$name の価格が更新されました。")
        } else {
            // 存在しない場合は新しく追加
            /* @@@ここに名前をセットに追加するコードを書いてください@@@ */
            fruitMap[name] = price
            println("$name が追加されました。")
        }
    }

    // 全てのフルーツの名前と価格を表示
    println("全てのフルーツの名前と価格:")
    printFruitDetails(fruitSet, fruitMap)

    // 特定のフルーツの価格を確認する
    print("価格を確認したいフルーツの名前を入力してください: ")
    val query = /* @@@ここにユーザーから入力を受け取るコードを書いてください@@@ */
    when {
        /* @@@ここにマップに名前が含まれているかを確認するコードを書いてください@@@ */ -> println("$query の価格は ${fruitMap[query]} 円です。")
        else -> println("$query は見つかりませんでした。")
    }
}

// フルーツの詳細を表示する関数
fun printFruitDetails(set: MutableSet<String>, map: MutableMap<String, Int>) {
    for (name in set) {
        val price = /* @@@ここにマップから価格を取得するコードを書いてください@@@ */
        println("$name の価格は $price 円です。")
    }
}

 

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

解答例

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

正解コードの例

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

********************

fun main() {
    // フルーツの名前を格納する**MutableSet**を作成
    val fruitSet = mutableSetOf<String>()

    // フルーツの名前と価格を格納する**MutableMap**を作成
    val fruitMap = mutableMapOf<String, Int>()

    // ユーザーにフルーツの情報を入力してもらう
    while (true) {
        print("フルーツの名前を入力してください (終了するには「終了」と入力): ")
        val name = readLine() ?: ""
        if (name == "終了") break
        print("$name の価格を入力してください: ")
        val price = readLine()?.toIntOrNull() ?: 0

        // フルーツの名前がセットに存在するか確認
        if (fruitSet.contains(name)) {
            // 存在する場合は価格を更新
            fruitMap[name] = price
            println("$name の価格が更新されました。")
        } else {
            // 存在しない場合は新しく追加
            fruitSet.add(name)
            fruitMap[name] = price
            println("$name が追加されました。")
        }
    }

    // 全てのフルーツの名前と価格を表示
    println("全てのフルーツの名前と価格:")
    printFruitDetails(fruitSet, fruitMap)

    // 特定のフルーツの価格を確認する
    print("価格を確認したいフルーツの名前を入力してください: ")
    val query = readLine() ?: ""
    when {
        fruitMap.containsKey(query) -> println("$query の価格は ${fruitMap[query]} 円です。")
        else -> println("$query は見つかりませんでした。")
    }
}

// フルーツの詳細を表示する関数
fun printFruitDetails(set: MutableSet<String>, map: MutableMap<String, Int>) {
    for (name in set) {
        val price = map[name] ?: 0
        println("$name の価格は $price 円です。")
    }
}

********************

コードの解説

今回のKotlinコードでは、MutableSetMutableMap の2つのコレクションを使ってフルーツの名前と価格を管理しています。

これらのデータ構造について詳しく説明し、コードの動作を理解していきましょう。

メイン関数の開始

fun main() {
    // フルーツの名前を格納する**MutableSet**を作成
    val fruitSet = mutableSetOf<String>()

    // フルーツの名前と価格を格納する**MutableMap**を作成
    val fruitMap = mutableMapOf<String, Int>()

main関数はKotlinプログラムのエントリーポイントです。ここでまず、2つのコレクションを作成しています。

  • MutableSet<String> は、フルーツの名前を一意に管理するためのセットです。Setの特徴として、同じ要素を2回追加することはできません。
  • MutableMap<String, Int> は、フルーツの名前とその価格をペアで管理するマップです。キーとしてフルーツの名前(String)、値としてその価格(Int)を格納します。

フルーツの情報を入力するループ

while (true) {
    print("フルーツの名前を入力してください (終了するには「終了」と入力): ")
    val name = readLine() ?: ""
    if (name == "終了") break
    print("$name の価格を入力してください: ")
    val price = readLine()?.toIntOrNull() ?: 0

このループでは、ユーザーがフルーツの名前と価格を入力できるようになっています。readLine()でユーザーからの入力を受け取り、それを処理します。

フルーツの名前がセットに存在するか確認

if (fruitSet.contains(name)) {
    fruitMap[name] = price
    println("$name の価格が更新されました。")
} else {
    fruitSet.add(name)
    fruitMap[name] = price
    println("$name が追加されました。")
}

fruitSetにすでに入力されたフルーツが存在するかを確認し、存在すれば価格を更新し、存在しなければ新しく追加します。

  • fruitSet.contains(name)で、セットにその名前があるかどうかをチェックします。
  • fruitMap[name] = priceは、Mapにフルーツの名前と価格を保存または更新します。

全てのフルーツの名前と価格を表示

println("全てのフルーツの名前と価格:")
printFruitDetails(fruitSet, fruitMap)

この部分では、printFruitDetails関数を使って、登録されたすべてのフルーツの名前とその価格を表示します。

フルーツの詳細を表示する関数

fun printFruitDetails(set: MutableSet<String>, map: MutableMap<String, Int>) {
    for (name in set) {
        val price = map[name] ?: 0
        println("$name の価格は $price 円です。")
    }
}

printFruitDetails関数では、Setに含まれているフルーツの名前を1つずつ取り出し、それに対応する価格をMapから取得して表示します。

特定のフルーツの価格を確認

print("価格を確認したいフルーツの名前を入力してください: ")
val query = readLine() ?: ""
when {
    fruitMap.containsKey(query) -> println("$query の価格は ${fruitMap[query]} 円です。")
    else -> println("$query は見つかりませんでした。")
}

最後に、ユーザーが特定のフルーツの名前を入力し、そのフルーツの価格を確認できる機能です。

MapcontainsKey()を使って、指定されたフルーツが存在するかをチェックします。

まとめ

このコードでは、MutableSetMutableMapを使用して、重複しないフルーツの名前を管理し、その価格を保存する方法を学びました。

MutableSetは同じ要素が複数回追加されないという特徴があり、MutableMapはキーと値のペアを使ってデータを効率的に管理できます。

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

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

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






    Kotlin練習問題集へ戻る
    トップページへ戻る