集合(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 找到。