Set固有の操作
Kotlinのコレクションパッケージには、積集合(intersection)の取得、マージ、またはコレクション同士の差集合(subtraction)の算出といった、Set(集合)でよく使われる操作のための拡張関数が含まれています。
2つのコレクションを1つにマージするには、union() 関数を使用します。これは中置形式(infix form)の a union b としても使用できます。 順序のあるコレクションの場合、オペランド(被演算子)の順序が重要になることに注意してください。結果のコレクションでは、最初のオペランドの要素が2番目のオペランドの要素よりも前に配置されます。
kotlin
fun main() {
val numbers = setOf("one", "two", "three")
// 順序に従って出力される
println(numbers union setOf("four", "five"))
// [one, two, three, four, five]
println(setOf("four", "five") union numbers)
// [four, five, one, two, three]
}2つのコレクション間の積集合(両方に存在する要素)を見つけるには、intersect() 関数を使用します。 別のコレクションに存在しないコレクション要素を見つけるには、subtract() 関数を使用します。 これらの関数はどちらも、例えば a intersect b のように中置形式で呼び出すことも可能です。
kotlin
fun main() {
val numbers = setOf("one", "two", "three")
// 同じ出力
println(numbers intersect setOf("two", "one"))
// [one, two]
println(numbers subtract setOf("three", "four"))
// [one, two]
println(numbers subtract setOf("four", "three"))
// [one, two]
}2つのコレクションのいずれかに存在するが、その積集合には含まれない要素を見つけるために、union() 関数を使用することもできます。 この操作(対称差(symmetric difference)として知られています)を行うには、2つのコレクション間の差をそれぞれ計算し、その結果をマージします。
kotlin
fun main() {
val numbers = setOf("one", "two", "three")
val numbers2 = setOf("three", "four")
// 差集合をマージする
println((numbers - numbers2) union (numbers2 - numbers))
// [one, two, four]
}union()、intersect()、および subtract() 関数はリストに対しても適用できます。 ただし、その結果は常に Set になります。この結果では、重複するすべての要素は1つにまとめられ、インデックスによるアクセスは利用できなくなります。
kotlin
fun main() {
val list1 = listOf(1, 1, 2, 3, 5, 8, -1)
val list2 = listOf(1, 1, 2, 2, 3, 5)
// 2つのリストの積集合の結果は Set になる
println(list1 intersect list2)
// [1, 2, 3, 5]
// 同一の要素は1つにまとめられる
println(list1 union list2)
// [1, 2, 3, 5, 8, -1]
}