数数集合 (CountedSet)

一个通用的 Swift 数数集合(多重集)实现。此结构旨在符合 Swift 3 的 SetAlgebra 协议。

用法 (Usage)

创建数数集合 (Creating a CountedSet)

数数集合是泛型的,可以使用任何泛型类型创建,只要该类型是 Hashable

var countedSet = CountedSet<Int>()

向数数集合添加元素 (Adding Elements to a CountedSet)

元素通过其 `insert` 和 `update` 方法添加到数数集合中。`insert` 返回一个元组,其中包含一个 `Bool` 值,表示操作是否成功;以及一个集合元素,该元素可以是已存在的匹配元素,也可以是新插入的元素。根据 Swift 3 中 SetAlgebra 的更新,仅当集合中尚不包含要插入的元素时,才会执行插入操作,并且如果元素被插入两次,也不会增加元素的计数。

let (success, element) = countedSet.insert(element)

`update` 用于更新集合中可能存在或可能不存在的元素的值。当您调用 `update` 时,如果集合中已存在匹配的元素,则会返回该元素;如果不存在,则返回 `nil`,在这种情况下会执行插入操作。在这两种情况下,给定元素的计数都将是预期的值,因此在一般情况下,您可能更希望使用 `update` 而不是 `insert`。

let element = countedSet.update(element)

从数数集合中移除元素 (Removing Elements From a CountedSet)

元素通过其 `remove` 实例方法从数数集合中移除。此方法接受集合的任何有效元素作为输入,并返回相同类型的可选值。如果此方法返回 `nil`,则表示集合不包含指定的元素;否则,表示集合包含该元素,并且该元素的计数会递减。

考虑以下示例,其中数字 42 被插入集合两次。`remove` 方法仅使用 42 作为输入调用一次,因此 42 不会从集合中移除。相反,它最初的关联计数通过 `insert` 调用设置为 1,然后设置为 2,然后通过 `remove` 调用将其计数递减回 1。再次为 42 调用 `remove` 将会将其从集合中移除。

var countedSet = CountedSet<Int>()
countedSet.insert(42)
countedSet.update(42)
countedSet.remove(42)

获取元素的计数 (Getting an Element's Count)

数数集合的重点在于它可以跟踪每个元素被添加到其中的次数,这当然意味着它提供了访问此信息的功能。为了尽可能保持命名约定与 NSCountedSet (在可能的情况下) 的相似性,可以通过其 `countForObject` 实例方法找到给定元素的计数。

var countedSet = CountedSet([1, 4, 4, 2, 2, 2])
let ones = countedSet.countForObject(1) // 1
let twos = countedSet.countForObject(2) // 3
let fours = countedSet.countForObject(4) // 2

并集、交集、异或和差集 (Unions, Intersections, XORs & Subtractions)

由于数数集合是集合,因此它提供了许多您期望从集合中获得的功能。这些功能包括创建并集、交集、异或和差集的方法。这些方法与其集合等效方法之间唯一的真正区别在于它们考虑了每个对象的计数。例如,当取两个集合的并集时,结果集合将包含来自两个输入集合的所有元素,并且每个对象的计数等于其先前两个计数的总和。

var countedSet1 = CountedSet([1, 1, 1, 2])
let countedSet2 = CountedSet([2, 2, 2, 3])

let union = countedSet1.union(countedSet2) // [1, 2, 3]
let ones = union.countForObject(1) // 3
let twos = union.countForObject(2) // 4
let threes = union.countForObject(3) // 1

其他 (Other Stuff)

isEmpty (isEmpty)
var countedSet = CountedSet<Int>()
countedSet.isEmpty // true
countedSet.insert(3)
countedSet.isEmpty // false
countedSet.remove(3)
countedSet.isEmpty // true

开发 (Development)

要生成 Xcode 项目,请调用 `make generate`。您还可以通过调用 `make open` 来生成并打开 Xcode 项目。