【Kotlin】レッスン4-3: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:オブジェクト指向編

<<前のページ

学習記事一覧

次のページ>>

Set(集合)を理解しよう|基本構文と特性を解説

「Set」は配列と同じコレクションの一種で、データの重複を許さないデータ構造です。

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

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

Set(集合)の概要と配列との違い

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

配列やリストとは違い、要素はインデックスで管理されず、値そのものでアクセスして使用されます。

特に イミュータブルセット(要素変更不可セット)と ミュータブルセット(要素変更可能セット)の2種類があり、使い分けることができます。

2種類のセットと配列との違いは以下の表の通りです。

比較要素配列(Array)Immutable Setmutable Set
要素の順序あり(順番が保持される)なし(順番は保証されない)なし(順番は保証されない)
要素の重複可能不可不可
サイズの変更不可不可可能
要素の参照方法インデックスでアクセス値そのものでアクセス値そのものでアクセス
要素の追加/削除不可不可可能

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

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

Immutable Set と mutable Set の作成方法

2種類のリストを作成するには、それぞれ専用の関数を使用する必要があります。

Immutable Setの作成|要素を変更できないリスト

要素の変更を許さないイミュータブルセットを作成するには setOf()関数 を使用します。

ImmutableSetは、一度作成すると要素の追加・削除・変更変更することができません。

// 不変集合の定義
val numbers: Set<Int> = setOf(1, 2, 3, 4, 5)	// イミュータブルセットの定義

Mutable Setの作成|要素を変更できるセット

後からでも要素の変更が可能なミュータブルセットを作成するには mutableSetOf()関数 を使います。

mutableSetは、作成後に要素を追加・削除・更新することが可能です。

// 可変集合の定義
val mutableNumbers: MutableSet<Int> = mutableSetOf(1, 2, 3, 4, 5)
mutableNumbers.add("6")		// セットに6を追加
mutableNumbers.remove("1")	// セットから1を削除

Setの活用例|要素の追加・削除・検索等の操作メソッド一覧

セットの操作に使用できるメソッド等を一覧で紹介します。

操作名説明・用途使い方サンプル備考
add要素を追加するset.add("D")MutableSetでのみ使用可能
remove指定した要素を削除するset.remove("A")存在しない要素を指定してもエラーにならない
contains要素が含まれているか調べるset.contains("B")true/falseを返す
sizeセットの要素数を取得set.sizeプロパティ(メソッドではない)
filter条件に合う要素だけ抽出するset.filter { it.startsWith("A") }新しいSet/Listを返す
map各要素を変換して新しいコレクションを作るset.map { it.lowercase() }新しいList/Setを返す

addremoveはミュータブルセット(mutableSetOf)でのみ利用可能です。contains, size, filter, mapは両方で利用できます。

まとめ|重複排除に最適なコレクション

セットは「重複しないコレクション」として、データの一意性を保証したい場面で非常に便利です。

ミュータブルセットなら要素の追加・削除も簡単に行え、filtermapなどの関数型操作も直感的に利用できます。

順序や重複を気にせずデータを管理したい場合には、セットを使うことでコードをシンプルかつ安全に保てるでしょう。

用途に応じてリストや配列と使い分け、Kotlinのコレクション操作をより自由に楽しんでください。

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

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

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

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

この問題の要件

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

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

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

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

この問題を解くヒント

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

Q
ヒント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で出力

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

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

この問題の解答と解説

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
// メイン関数
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")
    }
}
Q
正解コードの解説

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

メイン関数と不変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のさらなる可能性を探ってみてください!

Q
サイト改善アンケート & ご指摘/ご質問

本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などを アンケート 形式でお伺いしています。

また記事の内容に関する ご指摘ご質問 もお待ちしています。

1.このサイトをどのように活用していますか?また、今後どのように活用したいですか?
5.気になっているサービス・商品があれば教えてください。
※ 特定の記事に関する内容の場合は、記事番号(レッスン〇-〇)をご記入願います。

<<前のページ

学習記事一覧

次のページ>>

記事URLをコピーしました