Kotlin Setのさまざまな使い方

setOf、mutableSetOf、union、intersection、minusなど、Setのさまざまな使い方を紹介する。

Set概要

KotlinのSetはJavaのSetを基にしたコレクションである。Listと似ているが、重複しない要素だけを保持し、順序の概念はない。

Set & MutableSet

Setは読み取りのみをサポートするインターフェースである。

interface Set<out E> : Collection<E>

MutableSetは要素の追加と削除処理を提供する。

interface MutableSet<E> : Set<E>, MutableCollection<E>

Setの作成(setOf)

不変(immutable)なセットは、Kotlinに組み込まれているsetOf関数で作成できる。

fun main() {
    var s = setOf("Red", "Green", "Blue")
    println(s)
}

Output:

[Red, Green, Blue]

簡単な例として、変更可能なSetを作ってみよう。 Set作成後に要素を追加または削除したい場合は、mutableSetOf関数でセットを作成する必要がある。

val set: MutableSet<Int> = mutableSetOf(1, 2, 3)
set.add(1)
set.add(4)
println(set)

Output:

[1, 2, 3, 4]

Setの重複要素

Setに重複値を入れてみよう。

val set: Set<Int> = setOf(1, 2, 3, 1, 2)
println(set)

Output:

[1, 2, 3]

Setは重複する要素を保持しないため、1と2は1つずつだけ保存された。

Setの集合演算を行う

Setオブジェクトに+-などの演算を行うことで、和集合や差集合を求められる。

和集合(union)

+演算子またはunion()関数を使って、セット間の和集合(2つのセットに含まれる要素で構成される集合)を求められる。union()はinfix関数として定義されているため、演算子のように使用できる。

val s1 = setOf(1, 2, 3, 4)
val s2 = setOf(3, 4, 5, 6)

println(s1 + s2) // [1, 2, 3, 4, 5, 6]
println(s1 union s2) // 同じ
println(s1.union(s2)) // 同じ

積集合(intersection)

intersect関数を使うと、2つのSetの積集合(2つのセットに含まれる要素で構成される集合)を求められる。intersect()はinfix関数として定義されているため、演算子のように使用できる。

val s1 = setOf(1, 2, 3, 4)
val s2 = setOf(3, 4, 5, 6)

println(s1 intersect s2) // [3, 4]
println(s1.intersect(s2)) // 同じ

差集合(difference)

-演算子、minus()関数、またはsubtract()関数を使って、2つのSetの差集合(左側に指定したセットにだけ存在する要素で構成される集合)を求められる。subtract()はinfix関数として定義されているため、演算子のように使用できる。

val s1 = setOf(1, 2, 3, 4)
val s2 = setOf(3, 4, 5, 6)

println(s1 - s2) // [1, 2].
println(s1.minus(s2)) // 同じ
println(s1 subtract s2) // 同じ
println(s1.subtract(s2)) // 同じ

差集合は左辺と右辺の値を入れ替えると結果が変わる点に注意する必要がある。

println(s1 - s2) // [1, 2].
println(s2 - s1) // [5, 6].