【Kotlin】レッスン4-03:Setを理解しよう|重複なしのコレクション操作を学ぼう

一つ前のページでは List について学習しました。
今回は Set について見ていきましょう。
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:オブジェクト指向編
KotlinのSetを理解しよう|基本構文と特性を解説

Kotlinの「Set」はコレクションの一種で、データの重複を許さない特徴を持っています。
重複のないデータを管理したり、特定の値が存在するかどうかを確認する際に役立ちます。
本記事ではSetの基本構文と使用例について解説します。
Setの基本概念と特性を解説
Setは順序を保証せず、同じ要素が複数含まれないデータ構造です。
KotlinではSet
型のコレクションを作成する際に「不変Set(イミュータブルセット)」と「可変Set(ミュータブルセット)」を使い分けることができます。
不変Setは作成後に変更できませんが、可変Setは追加や削除が可能です。
重複データを管理しない点が特徴で、効率的な集合演算に利用されます。
KotlinにおけるSetの構文|setOfとmutableSetOfの違い
以下のコードは、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と可変Setの使い分けポイント
不変Set(setOf
)は作成後に要素を変更できません。
一方で可変Set(mutableSetOf
)は、add
やremove
といったメソッドを使って柔軟に操作できます。
これにより用途に応じたコレクションを選択できます。
Setのまとめ|重複排除に最適なコレクション
Kotlinの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") } }
- 正解コードの解説
-
コードをブロックごとに分割して解説します。
メイン関数と不変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のさらなる可能性を探ってみてください!