Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

集合(Sets)

Set 是一种集合,只允许每个值的一个元素。

最常见的 Set 操作是使用 incontains() 进行成员检测:

// 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)
}

这个例子展示了:

  1. 将重复的元素放入 Set 会自动删除这些重复元素。
  2. 对于集合来说,元素的顺序并不重要。如果两个集合包含相同的元素,那么它们是相等的。
  3. incontains() 都用于成员检测。
  4. 您可以执行通常的维恩图操作,如检查子集、并集、交集和差集,使用点表示法(set.union(other))或中缀表示法(set intersect other)。unionintersectsubtract 函数可以与中缀表示法一起使用。
  5. 集合的差集可以使用 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 找到。