集合(Sets)
Set是一种集合,只允许每个值的一个元素。
最常见的 Set 操作是使用 in 或 contains() 进行成员检测:
// Sets/Sets.kt
import atomictest.eq
fun main() {
val intSet = setOf(1, 1, 2, 3, 9, 9, 4)
// 没有重复的元素:
intSet eq setOf(1, 2, 3, 4, 9)
// 元素的顺序无关紧要:
setOf(1, 2) eq setOf(2, 1)
// 集合的成员检测:
(9 in intSet) eq true
(99 in intSet) eq false
intSet.contains(9) eq true
intSet.contains(99) eq false
// 这个集合是否包含另一个集合?
intSet.containsAll(setOf(1, 9, 2)) eq true
// 集合的并集:
intSet.union(setOf(3, 4, 5, 6)) eq
setOf(1, 2, 3, 4, 5, 6, 9)
// 集合的交集:
intSet intersect setOf(0, 1, 2, 7, 8) eq
setOf(1, 2)
// 集合的差集:
intSet subtract setOf(0, 1, 9, 10) eq
setOf(2, 3, 4)
intSet - setOf(0, 1, 9, 10) eq
setOf(2, 3, 4)
}
这个例子展示了:
- 将重复的元素放入
Set会自动删除这些重复元素。 - 对于集合来说,元素的顺序并不重要。如果两个集合包含相同的元素,那么它们是相等的。
in和contains()都用于成员检测。- 您可以执行通常的维恩图操作,如检查子集、并集、交集和差集,使用点表示法(
set.union(other))或中缀表示法(set intersect other)。union、intersect和subtract函数可以与中缀表示法一起使用。 - 集合的差集可以使用
subtract()或减法运算符来表示。
要从 List 中删除重复元素,请将其转换为 Set:
// Sets/RemoveDuplicates.kt
import atomictest.eq
fun main() {
val list = listOf(3, 3, 2, 1, 2)
list.toSet() eq setOf(1, 2, 3)
list.distinct() eq listOf(3, 2, 1)
"abbcc".toSet() eq setOf('a', 'b', 'c')
}
您还可以使用 distinct(),它返回一个 List。您可以在 String 上调用 toSet(),将其转换为包含唯一字符的集合。
与 List 一样,Kotlin 为 Set 提供了两个创建函数。setOf() 的结果是只读的。要创建一个可变的 Set,请使用 mutableSetOf():
// Sets/MutableSet.kt
import atomictest.eq
fun main() {
val mutableSet = mutableSetOf<Int>()
mutableSet += 42
mutableSet += 42
mutableSet eq setOf(42)
mutableSet -= 42
mutableSet eq setOf<Int>()
}
运算符 += 和 -= 可以向 Set 中添加和移除元素,与处理 List 一样。
练习和答案可以在 www.AtomicKotlin.com 找到。