• Swift 学习笔记二(Set篇)


    目录

    1 Set 的概念和特性

    1.1 Set 的概念

    1.2 Set 的三个特性

    1.3 Set 的创建

    1.4 Set 的类型的哈希值

    1.5 Set的自定义类型需要实现 Hashable 协议

    2 Set的访问和修改

    2.1 Set的遍历

    2.2 Set的访问

    2.3 Set 的添加元素

    2.4 Set的移除元素

    3 Set 的操作

    3.1Set 操作的定义

    3.2 Set 的基本操作

    3.3 Set 判断方法


    1 Set 的概念和特性

    1.1 Set 的概念

    • Set 是指具有某种特定性质的具体的或抽象的对象汇总而成的集体。其中,构成 Set 的这些对象则称为该 Set 的元素。

    1.2 Set 的三个特性

    • 确定性 :给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一。
    • 互斥性 : 一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。
    • 无序性 : 一个集合中,每个元素的地位都是相同的,元素之间是无序的。

    1.3 Set 的创建

    • 使用初始化器语法来创建一个确定类型的空 Set。
    • 使用数组字面量创建 Set。
    1. var student = Set<String>()
    2. student.insert("zhangsan")
    3. print(student)
    4. /**
    5. 输出结果如下:
    6. ["zhangsan"]
    7. */

    1.4 Set 的类型的哈希值

    • 为了能让类型储存在 Set 当中,它必须是可哈希的——就是说类型必须提供计算它自身哈希值的方法。
    • 所有 Swift 的基础类型(比如 String, Int, Double, 和 Bool)默认都是可哈希的,并且可以用于 Set 或者 Dictionary 的键。

    1.5 Set的自定义类型需要实现 Hashable 协议

    1. struct Student{
    2. var name:String
    3. var age: Int
    4. }
    5. extension Student:Hashable{
    6. func hash(into hasher: inout Hasher) {
    7. hasher.combine(name)
    8. }
    9. }
    10. extension Student: Equatable{
    11. static func == (lhs: Student,rhs:Student) -> Bool{
    12. return lhs.name == rhs.name
    13. }
    14. }

    2 Set的访问和修改

    2.1 Set的遍历

    • 可以使用 For-In 遍历 Set。
    • 因为 Set 是无序的,如果要顺序遍历 Set,使用 sorted()方法。
    1. //遍历
    2. let students: Set = ["zhangsan","lisi","wangwu"]
    3. for student in students {
    4. print(student)
    5. }
    6. print("----------------分割线------------------")
    7. for student in students.sorted(){
    8. print(student)
    9. }
    10. /**
    11. 输出结果如下:
    12. zhangsan
    13. wangwu
    14. lisi
    15. ----------------分割线------------------
    16. lisi
    17. wangwu
    18. zhangsan
    19. */

    2.2 Set的访问

    • 使用 count 获取 Set 里元素个数。
    • 使用 isEmpty 判断 Set 是否为空。
    1. //访问
    2. let student: Set<String> = ["zhagnsan","lisi","wangwu"]
    3. print(student.count)
    4. print(student.isEmpty)
    5. /**
    6. 输出结果如下:
    7. 3
    8. false
    9. */

    2.3 Set 的添加元素

    • insert(_:) 添加一个元素到 Set。
    • update(with:) 如果已经有相等的元素,替换为新元素。如果 Set 中没有,则插入。
    1. var studentSet: Set = [Student(name: "zhangsan", age: 15),Student(name: "lisi", age: 16)]
    2. studentSet.insert(Student(name: "wangwu", age: 17))
    3. print(studentSet)
    4. studentSet.update(with: Student(name: "zhangsan", age: 25))
    5. print(studentSet)
    6. studentSet.update(with: Student(name: "niuliu", age: 19))
    7. print(studentSet)
    8. /**
    9. 输出结果如下:
    10. [Student(name: "wangwu", age: 17),
    11. Student(name: "zhangsan", age: 15),
    12. Student(name: "lisi", age: 16)]
    13. [Student(name: "wangwu", age: 17),
    14. Student(name: "zhangsan", age: 25),
    15. Student(name: "lisi", age: 16)]
    16. [Student(name: "zhangsan", age: 25),
    17. Student(name: "wangwu", age: 17),
    18. Student(name: "lisi", age: 16),
    19. Student(name: "niuliu", age: 19)]
    20. */

    2.4 Set的移除元素

    • fifilter(_:) 返回一个新的 Set,新 Set 的元素是原始 Set 符合条件的元素。
    • remove(_:) 从 Set 当中移除一个元素,如果元素是 Set 的成员就移除它,并且返回移除的
      值,如果合集没有这个成员就返回 nil 。
    • removeAll() 移除所有元素。
    • removeFirst() 移除 Set 的第一个元素,因为 Set 是无序的,所以第一个元素并不是放入的
      第一个元素。
    1. var studentSet: Set = [Student(name: "zhangsan", age: 15),Student(name: "lisi", age: 16),Student(name: "wangwu", age: 17)]
    2. print(studentSet)
    3. studentSet.remove(Student(name: "lisi",age: 80))
    4. print(studentSet)
    5. studentSet.removeFirst()
    6. print(studentSet)
    7. studentSet.removeAll()
    8. print(studentSet)
    9. /**
    10. 输出结果如下:
    11. [Student(name: "wangwu", age: 17),
    12. Student(name: "zhangsan", age: 15),
    13. Student(name: "lisi", age: 16)]
    14. [Student(name: "zhangsan", age: 25),
    15. Student(name: "wangwu", age: 17),
    16. Student(name: "niuliu", age: 19)]
    17. [Student(name: "wangwu", age: 17),
    18. Student(name: "niuliu", age: 19)]
    19. []
    20. */

    3 Set 的操作

    3.1Set 操作的定义

    • intersection(_:) 交集,由属于A且属于B的相同元素组成的集合,记作A∩B(或B∩A)。
    • union(_:) 并集,由所有属于集合A或属于集合B的元素所组成的集合,记作A∪B(或B∪A)。
    • symmetricDifffference(_:) 对称差集,集合A与集合B的对称差集定义为集合A与集合B中所有不属
      于A∩B的元素的集合。
    • subtracting(_:) 相对补集,由属于A而不属于B的元素组成的集合,称为B关于A的相对补集,记
      作A-B或A\B。

    3.2 Set 的基本操作

    1. let setA: Set<Character> = ["a","b","C"]
    2. let setB: Set<Character> = ["a","d","e"]
    3. print(setA.intersection(setB))//交集
    4. print(setA.union(setB))//并集
    5. print(setA.symmetricDifference(setB))//补集
    6. print(setA.subtracting(setB))//差集
    7. /**
    8. 输出结果如下:
    9. ["a"]
    10. ["d", "b", "C", "a", "e"]
    11. ["d", "b", "C", "e"]
    12. ["C", "b"]
    13. */

    3.3 Set 判断方法

    • isSubset(of:) 判断是否是另一个 Set 或者 Sequence 的子集。
    • isSuperset(of:) 判断是否是另一个 Set 或者 Sequence 的超集。
    • isStrictSubset(of:) 和 isStrictSuperset(of:) 判断是否是另一个 Set 的子集或者超集,但是
      又不等于另一个 Set 。
    • isDisjoint(with:) 判断两个 Set 是否有公共元素,如果没有返回 true,如果有返回 false
    1. let smallSet:Set = [1,2,3]
    2. let bigSet: Set = [1,2,3,4,5]
    3. print(smallSet.isSubset(of: bigSet))
    4. print(bigSet.isSuperset(of: smallSet))
    5. print(smallSet.isStrictSubset(of: bigSet))
    6. print(bigSet.isStrictSuperset(of: smallSet))
    7. print(smallSet.isDisjoint(with: bigSet))
    8. /**
    9. 输出结果如下:
    10. true
    11. true
    12. true
    13. true
    14. false
    15. */

  • 相关阅读:
    卷积神经网络的卷积层
    【Java】异常处理
    QDockWidget组件的隐藏与显示(按钮控制)
    软件外包开发代码质量评测
    如何将项目(工程/代码)文件上传到gitee?(注意一下,有几个坑)
    【JavaWeb】一篇承载Ajax、Axios、Json的学习笔记~
    [django项目实战1]图书管理系统
    excel筛选后求和
    SpringSecurity6从入门到上天系列第六篇:解决这个问题为什么在引入SpringSecurity之后所有的请求都需要先做登录认证才可以进行访问呢
    定位相关论文阅读:神经惯性定位(二)Neural Inertial Localization
  • 原文地址:https://blog.csdn.net/qq_35460159/article/details/132773530