美文网首页
Swift 中的 Set

Swift 中的 Set

作者: 孤雁_南飞 | 来源:发表于2021-01-18 09:02 被阅读0次

Set 定义和创建

  • Set 概念
  1. Set 是指具有某种特定性质具体的或抽象的对象,汇总而成的集体,其中,构成 Set 的这些对象则称为该 Set 的元素
  • Set 集合的三个特性
  1. 确定性:给定一个集合,任给一个元素,该元素或者属于、或者不属于该集合,二者比居其一
  2. 互斥性:一个集合中,任意两个元素都认为是不相同的,即每个元素只能出现一次
  3. 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的
  • Swift 里面的集合
  1. Swift 的集合类型写作 Set<Element>, 这里的 Element 是 Set 要储存的类型,不同与数组,集合是没有等价的简写
  • 创建 Set
  1. 使用初始化器语法来创建一个确定类型的空 Set
  2. 使用数组字面量创建 Set
var letters = Set<Character>()
letters.insert("c")
print(letters)

var course: Set<String> = ["Math", "English", "History"]
course.insert("History")
print(course)
  • Set类型的哈希值
  1. 为了能让类型存储在 Set 当中,它必须是可哈希的--就是说类型必须提供计算它自己哈希值的方法
  2. 所有的 Swift 的基础类型 (比如 String、Int、Double、Bool) 默认都是可哈希的,并且可用于 Set 或者 Dictionary 的键
  3. 自定义类型需要实现 Hashable 协议
struct Person {
    var name: String
    var age: Int
}
extension Person: Hashable {
    func hash(into hasher: inout Hasher) {
        hasher.combine(name)
        hasher.combine(age)
    }
}
var personSet = Set<Person>()
personSet.insert(Person(name: "zhangsan", age: 28))
print(personSet)

Set 访问与修改

  • 遍历 Set
  1. 可以使用 for-in 遍历 Set
  2. 因为 Set 是无序的,如果要遍历 Set, 使用sorted() 方法
let courses: Set = ["Math", "English", "History"]
for course in courses {
    print(course)
} 
for course in courses.sorted() {
    print(course)
}
  • 访问 Set
  1. 使用 count 获取 Set 里元素的个数
  2. 使用 isEmpty 判断 Set 是否为空
var courses: Set = ["Math", "English", "History"]
print(courses.count)
print(courses.isEmpty)
courses = []
print(courses.isEmpty)
  • 添加元素
  1. insert(_:) 添加一个元素到 Set
  2. update(with:) 如果已经有相等(哈希值相等)的元素,替换为新元素,如果 Set 中没有,则插入
struct Person {
    var name: String
    var age: Int
}
extension Person: Hashable {
    func hash(into hasher: inout Hasher) {
        hasher.combine(name)
//        hasher.combine(age) //只对那么对比
    }
}
extension Person: Equatable {
    static func == (lhs: Person, rhs: Person) -> Bool {
        return lhs.name == rhs.name
    }
}
var personSet: Set = [Person(name: "zhangsan", age: 28), Person(name: "lisi", age: 29)]
personSet.update(with: Person(name: "zhangsan", age: 39))
personSet.update(with: Person(name: "wangwu", age: 18))
print(personSet)
  • 移除元素
  1. fillter(_:) 返回一个新的 Set,新 Set 的元素是原始 Set 符合条件的元素
print(personSet.filter({ $0.age > 20 }))
  1. remove(_:) 从 Set 当中移除一个元素,如果元素是 Set 的成员就移除它,并且返回移除的值,如果合集没有这个成员就返回nil
  2. removeAll() 移除所有元素
personSet.remove(Person(name: "zhangsan", age: 39))
print(personSet)

4.removeFirst() 移除 Set 的第一个元素,因为 Set 是无序的, 所以第一个元素并不是放入的第一个元素

Set计算和判断

  • 基本 Set 操作的定义
  1. intersection(_:) 交集,由属于 A 且属于 B 的相同元素组成的集合
  2. union(_:) 并集,由所有属于集合 A 或属于集合 B 的元素组成的集合
  3. symmetricDifference(_:) 对称差集,集合 A 与集合 B 的对称差集,定义为集合 A 与集合 B中所有不属于 A B 的元素的集合
  4. subtracting(_:) 相对补集, 有属于 A 而不属于 B 的元素组成的集合,成为 B 关于 A 的相对补集
let set: Set<Character> = ["A", "B", "C"]
let set2: Set<Character> = ["B", "E", "F", "G"]
print(set.intersection(set2))
print(set.union(set2))
print(set.symmetricDifference(set2))
print(set.subtracting(set2))
  • Set 判断方法
  1. isSubSet(of:) 判断是否是另一个 Set 或者 Sequence 的子集
  2. isSuperset(of:) 判断是否是另一个 Set 或者 Sequence 的超集
  3. isStrictSubset(of:) 和 isStrictSuperset(of:) 判断是否是另一个 Set 的子集或者超集,但是又不等于另一个 Set
  4. isDisjoint(with:) 判断两个 Set 是否有公共元素,如果没有返回 true 有过有返回false
let smallSet: Set = [1, 2, 3]
let bigSet: Set = [1, 2, 3, 4]
print(smallSet.isSubset(of: bigSet))
print(bigSet.isSuperset(of: smallSet))
print(smallSet.isStrictSubset(of: bigSet))
print(bigSet.isStrictSuperset(of: smallSet))
print(smallSet.isDisjoint(with: bigSet))

相关文章

网友评论

      本文标题:Swift 中的 Set

      本文链接:https://www.haomeiwen.com/subject/axutzktx.html