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

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

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

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

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

Kotlinの「Set」とは

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



Kotlinの「Set」はコレクションの一種で、データの重複を許さない特徴を持っています。

重複のないデータを管理したり、特定の値が存在するかどうかを確認する際に役立ちます。

本記事ではSetの基本構文と使用例について解説します。

Setとは?

Setは順序を保証せず、同じ要素が複数含まれないデータ構造です。

KotlinではSet型のコレクションを作成する際に「不変Set(イミュータブルセット)」と「可変Set(ミュータブルセット)」を使い分けることができます。

不変Setは作成後に変更できませんが、可変Setは追加や削除が可能です。

重複データを管理しない点が特徴で、効率的な集合演算に利用されます。

Setの基本構文

以下のコードは、Setの基本的な宣言方法を示しています。

// 不変Setの定義
val numbers: Set<Int> = setOf(1, 2, 3, 4, 5)

// 可変Setの定義
val mutableNumbers: MutableSet<Int> = mutableSetOf(1, 2, 3, 4, 5)

不変SetはsetOfを使用し、宣言後は変更ができません。

一方mutableSetOfを使用することで要素を追加・削除できる可変Setを作成できます。

Setの使用例

次の例は不変Setと可変Setを使った操作の方法を示します。

fun main() {
    // 不変Set
    val fruits = setOf("Apple", "Banana", "Cherry")
    println("Fruits: $fruits")
    
    // 可変Set
    val mutableFruits = mutableSetOf("Apple", "Banana", "Cherry")
    println("Mutable Fruits: $mutableFruits")

    // 要素の追加
    mutableFruits.add("Durian")
    println("After adding Durian: $mutableFruits")

    // 要素の削除
    mutableFruits.remove("Banana")
    println("After removing Banana: $mutableFruits")

    // 要素が存在するか確認
    if ("Cherry" in mutableFruits) {
        println("Cherry is in the set.")
    }
}

このコードを実行すると以下のように出力されます。

Fruits: [Apple, Banana, Cherry]  
Mutable Fruits: [Apple, Banana, Cherry]  
After adding Durian: [Apple, Banana, Cherry, Durian]  
After removing Banana: [Apple, Cherry, Durian]  
Cherry is in the set.

このように、Setを使うことで効率的にデータを管理し、操作できます。

SetとmutableSetの違い

不変Set(setOf)は作成後に要素を変更できません。

一方で可変Set(mutableSetOf)は、addremoveといったメソッドを使って柔軟に操作できます。

これにより用途に応じたコレクションを選択できます。

まとめ

KotlinのSetは重複を許さないデータを効率的に管理するための便利なデータ構造です。

不変Setと可変Setの違いを理解し、適切に使い分けることで、コードの効率性と可読性を向上させることができます。

Setの練習問題:Setでデータを追加・削除して検索しよう

Setを使ってフルーツを管理するプログラムを作成しましょう。

プログラムでは不変Setと可変Setを定義し、データの追加や削除、検索を実行します。

最終的に可変Set内の要素を繰り返し表示して、Setの使い方を学びます。

この問題の要件

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

  • 不変SetをsetOfを使用して定義すること。内容は「りんご」「みかん」「バナナ」で、重複を許さない仕様にすること。
  • 可変SetをmutableSetOfを使用して定義すること。内容は「すいか」「ぶどう」「もも」とすること。
  • 可変Setに要素「メロン」を追加すること。
  • 可変Setから要素「ぶどう」を削除すること。
  • 可変Setに「すいか」という要素が含まれているかを確認し、結果を出力すること。
  • 可変Setの全要素を繰り返し表示すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

不変Setの内容: [りんご, みかん, バナナ]  
初期可変Setの内容: [すいか, ぶどう, もも]  
追加後の可変Set: [すいか, ぶどう, もも, メロン]  
削除後の可変Set: [すいか, もも, メロン]  
「すいか」は可変Setに 含まれています  
可変Setの全要素:  
- すいか  
- もも  
- メロン

この問題を解くヒント

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

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

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

1:main関数の定義
  □ val immutableSetをsetOfで初期化(重複要素を無視)
  □ printlnを使用して不変Setの内容を出力
  □ val mutableSetをmutableSetOfで初期化
  □ printlnを使用して初期可変Setの内容を出力
  □ mutableSetに”メロン”を追加
  □ printlnを使用して追加後の可変Setを出力
  □ mutableSetから”ぶどう”を削除
  □ printlnを使用して削除後の可変Setを出力
  □ if文を使用して”すいか”がmutableSetに含まれているか確認
  □ □ 真の場合、「含まれています」とする文字列を選択
  □ □ 偽の場合、「含まれていません」とする文字列を選択
  □ printlnを使用して”すいか”の確認結果を出力
  □ printlnを使用して「可変Setの全要素」を出力
  □ forループでmutableSetの全要素を繰り返し処理
  □ □ 各要素をprintlnで出力

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

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

// メイン関数
fun main() {
    // 不変Setを作成
    /*【穴埋め問題1】
    ここで不変Setを作成し、変数immutableSetに代入するコードを書いてください。
    */

    println("不変Setの内容: $immutableSet")

    // 可変Setを作成
    /*【穴埋め問題2】
    ここで可変Setを作成し、変数mutableSetに代入するコードを書いてください。
    */

    println("初期可変Setの内容: $mutableSet")

    // 要素を追加
    /*【穴埋め問題3】
    可変Setに要素"メロン"を追加するコードを書いてください。
    */

    println("追加後の可変Set: $mutableSet")

    // 要素を削除
    /*【穴埋め問題4】
    可変Setから要素"ぶどう"を削除するコードを書いてください。
    */

    println("削除後の可変Set: $mutableSet")

    // 要素が含まれているかを確認
    val isPresent = if ("すいか" in mutableSet) "含まれています" else "含まれていません"
    println("「すいか」は可変Setに $isPresent")

    // Setの全要素を繰り返し出力
    println("可変Setの全要素:")
    for (fruit in mutableSet) {
        println("- $fruit")
    }
}

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

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



練習問題の解答と解説

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

正解コードの例

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

// メイン関数
fun main() {
    // 不変Setを作成
    val immutableSet = setOf("りんご", "みかん", "バナナ", "りんご") // 重複要素は無視される
    println("不変Setの内容: $immutableSet")

    // 可変Setを作成
    val mutableSet = mutableSetOf("すいか", "ぶどう", "もも")
    println("初期可変Setの内容: $mutableSet")

    // 要素を追加
    mutableSet.add("メロン")
    println("追加後の可変Set: $mutableSet")

    // 要素を削除
    mutableSet.remove("ぶどう")
    println("削除後の可変Set: $mutableSet")

    // 要素が含まれているかを確認
    val isPresent = if ("すいか" in mutableSet) "含まれています" else "含まれていません"
    println("「すいか」は可変Setに $isPresent")

    // Setの全要素を繰り返し出力
    println("可変Setの全要素:")
    for (fruit in mutableSet) {
        println("- $fruit")
    }
}

正解コードの解説

今回のコードではKotlinの「Set」というデータ構造を使い、コレクションの操作方法を学びます。

不変Setと可変Setの違い、Setにデータを追加・削除する方法、そしてSet内の要素を確認する方法を学びます。

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

メイン関数と不変Setの作成

fun main() {
    // 不変Setを作成
    val immutableSet = setOf("りんご", "みかん", "バナナ") // 重複要素は無視される
    println("不変Setの内容: $immutableSet")
}
  • fun main: Kotlinプログラムのエントリーポイントです。ここからコードの実行が始まります。
  • setOf: 不変Setを作成します。不変Setは作成後に内容を変更できません。このコードでは「りんご」「みかん」「バナナ」を含む不変Setを作成しています。重複する要素(例: “りんご”が2回追加されるなど)は自動的に無視されます。
  • println: Setの内容をコンソールに出力します。KotlinではSetをそのまま出力すると、わかりやすくフォーマットされた形で表示されます。

可変Setの作成と操作

val mutableSet = mutableSetOf("すいか", "ぶどう", "もも")
println("初期可変Setの内容: $mutableSet")
mutableSet.add("メロン")
println("追加後の可変Set: $mutableSet")
mutableSet.remove("ぶどう")
println("削除後の可変Set: $mutableSet")
  • mutableSetOf: 可変Setを作成します。可変Setは作成後に内容を変更できます。ここでは「すいか」「ぶどう」「もも」を初期要素として定義しています。
  • add: 可変Setに新しい要素を追加します。このコードでは「メロン」を追加しています。
  • remove: 可変Setから指定した要素を削除します。このコードでは「ぶどう」を削除しています。
  • println: 可変Setの内容を操作ごとに出力して、変更の様子を確認できます。

Set内の要素を検索

val isPresent = if ("すいか" in mutableSet) "含まれています" else "含まれていません"
println("「すいか」は可変Setに $isPresent")
  • in演算子: 指定した要素がSetに含まれているかを確認します。このコードでは「すいか」がSet内にあるかを調べています。
  • if文: 条件に応じて異なる結果を出力します。「すいか」がSetに含まれている場合は「含まれています」、含まれていない場合は「含まれていません」と出力されます。

Setの全要素を繰り返し表示

println("可変Setの全要素:")
for (fruit in mutableSet) {
    println("- $fruit")
}
  • forループ: Setの各要素を1つずつ処理します。ここではSet内の全ての要素を繰り返し出力します。
  • println: 各要素を1行ずつ出力します。-を付けて整った形式で表示しています。

まとめ

このプログラムではKotlinのSetを使ってコレクション操作を学びました。

不変Setと可変Setの違い、Setへのデータの追加・削除、検索方法、そして全要素の表示を理解できたと思います。

Setはデータの重複を防ぎ、効率的なデータ管理を可能にする非常に便利なコレクションです。

この知識を他のプログラムに活かして、Kotlinのさらなる可能性を探ってみてください!

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

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

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

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






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