Menu
CoddyTech

差集与对称差

本课属于 Coddy Swift 学习旅程的“逻辑与流程”单元。第 20 课,共 56 课。

再加上两个集合操作,这套工具就齐全了。

subtracting 会返回第一个集合中不在第二个集合中的元素:

let a: Set = [1, 2, 3, 4]
let b: Set = [3, 4, 5]
a.subtracting(b)             // {1, 2}

symmetricDifference 返回恰好属于两个集合之一,而不是同时属于两个集合的元素:

a.symmetricDifference(b)     // {1, 2, 5}

加上 union 和 intersection,这四种运算涵盖了你日常会遇到的所有集合代数问题。

集合成员判断也可以用作过滤器:在 O(1) 时间内检查一个值是否属于某个集合:

let stopwords: Set = ["the", "a", "an"]
let words = ["the", "cat", "sat", "on", "a", "mat"]
let real = words.filter { !stopwords.contains($0) }
// ["cat", "sat", "on", "mat"]
challenge icon

挑战

简单

读取两行输入,每行都是以逗号分隔的字符串列表。分别将它们视为 currentMembers 和 renewedMembers。

打印三行,每行按字母顺序排序并用 , 连接(如果没有元素,则为空):

  1. Lapsed: <...> > 当前集合减去续期集合
  2. New: <...> > 续期集合减去当前集合
  3. Stayed: <...> > 两个集合的交集

如果第 1 行输入 alice,bob,cara,第 2 行输入 bob,cara,dan,则输出为:

Lapsed: alice
New: dan
Stayed: bob,cara

亲手试试

let current = Set(readLine()!.components(separatedBy: ","))
let renewed = Set(readLine()!.components(separatedBy: ","))

// TODO: 输出 Lapsed(current - renewed)、New(renewed - current)和 Stayed(交集)
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Swift 在线编辑器