Swift 学习笔记二(Set篇)

news/2024/7/20 22:52:09 标签: 学习, swift, ios

目录

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。
var student = Set<String>()
student.insert("zhangsan")
print(student)

/**
输出结果如下:
 
 ["zhangsan"]
 
 */

1.4 Set 的类型的哈希值

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

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

struct Student{
    var name:String
    var age: Int
}

extension Student:Hashable{
    func hash(into hasher: inout Hasher) {
        hasher.combine(name)
    }
}

extension Student: Equatable{
    static func == (lhs: Student,rhs:Student) -> Bool{
        return lhs.name == rhs.name
    }
}

2 Set的访问和修改

2.1 Set的遍历

  • 可以使用 For-In 遍历 Set。
  • 因为 Set 是无序的,如果要顺序遍历 Set,使用 sorted()方法。
//遍历
let students: Set = ["zhangsan","lisi","wangwu"]
for student in students {
    print(student)
}

print("----------------分割线------------------")

for student in students.sorted(){
    print(student)
}

/**
输出结果如下:

 zhangsan
 wangwu
 lisi
 ----------------分割线------------------
 lisi
 wangwu
 zhangsan
 */

2.2 Set的访问

  • 使用 count 获取 Set 里元素个数。
  • 使用 isEmpty 判断 Set 是否为空。
//访问

let student: Set<String> = ["zhagnsan","lisi","wangwu"]
print(student.count)
print(student.isEmpty)

/**
输出结果如下:
 
 3
 false
 */

2.3 Set 的添加元素

  • insert(_:) 添加一个元素到 Set。
  • update(with:) 如果已经有相等的元素,替换为新元素。如果 Set 中没有,则插入。

var studentSet: Set = [Student(name: "zhangsan", age: 15),Student(name: "lisi", age: 16)]
studentSet.insert(Student(name: "wangwu", age: 17))
print(studentSet)
studentSet.update(with: Student(name: "zhangsan", age: 25))
print(studentSet)
studentSet.update(with: Student(name: "niuliu", age: 19))
print(studentSet)


/**
输出结果如下:
 
 [Student(name: "wangwu", age: 17), 
  Student(name: "zhangsan", age: 15), 
  Student(name: "lisi", age: 16)]

 [Student(name: "wangwu", age: 17), 
  Student(name: "zhangsan", age: 25),
  Student(name: "lisi", age: 16)]

 [Student(name: "zhangsan", age: 25),
  Student(name: "wangwu", age: 17), 
  Student(name: "lisi", age: 16),
  Student(name: "niuliu", age: 19)]

 */

2.4 Set的移除元素

  • fifilter(_:) 返回一个新的 Set,新 Set 的元素是原始 Set 符合条件的元素。
  • remove(_:) 从 Set 当中移除一个元素,如果元素是 Set 的成员就移除它,并且返回移除的
    值,如果合集没有这个成员就返回 nil 。
  • removeAll() 移除所有元素。
  • removeFirst() 移除 Set 的第一个元素,因为 Set 是无序的,所以第一个元素并不是放入的
    第一个元素。

var studentSet: Set = [Student(name: "zhangsan", age: 15),Student(name: "lisi", age: 16),Student(name: "wangwu", age: 17)]
print(studentSet)
studentSet.remove(Student(name: "lisi",age: 80))
print(studentSet)
studentSet.removeFirst()
print(studentSet)
studentSet.removeAll()
print(studentSet)

/**
输出结果如下:
 
 [Student(name: "wangwu", age: 17),
  Student(name: "zhangsan", age: 15), 
  Student(name: "lisi", age: 16)]

 [Student(name: "zhangsan", age: 25), 
  Student(name: "wangwu", age: 17), 
  Student(name: "niuliu", age: 19)]

 [Student(name: "wangwu", age: 17),
  Student(name: "niuliu", age: 19)]

 []

 */

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 的基本操作

let setA: Set<Character> = ["a","b","C"]
let setB: Set<Character> = ["a","d","e"]

print(setA.intersection(setB))//交集
print(setA.union(setB))//并集
print(setA.symmetricDifference(setB))//补集
print(setA.subtracting(setB))//差集

/**
输出结果如下:

 ["a"]
 ["d", "b", "C", "a", "e"]
 ["d", "b", "C", "e"]
 ["C", "b"]
 */

3.3 Set 判断方法

  • isSubset(of:) 判断是否是另一个 Set 或者 Sequence 的子集。
  • isSuperset(of:) 判断是否是另一个 Set 或者 Sequence 的超集。
  • isStrictSubset(of:) 和 isStrictSuperset(of:) 判断是否是另一个 Set 的子集或者超集,但是
    又不等于另一个 Set 。
  • isDisjoint(with:) 判断两个 Set 是否有公共元素,如果没有返回 true,如果有返回 false
let smallSet:Set = [1,2,3]
let bigSet: Set = [1,2,3,4,5]
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))

/**
输出结果如下:

 true
 true
 true
 true
 false

 */


http://www.niftyadmin.cn/n/5014275.html

相关文章

深度解析自然语言处理之篇章分析

在本文中&#xff0c;我们深入探讨了篇章分析的概念及其在自然语言处理&#xff08;NLP&#xff09;领域中的研究主题&#xff0c;以及两种先进的话语分割方法&#xff1a;基于词汇句法树的统计模型和基于BiLSTM-CRF的神经网络模型。 关注TechLead&#xff0c;分享AI全维度知识…

HedgeDoc安装教程

HedgeDoc 安装&#xff08;mysql作为数据库&#xff09; hedgedoc官方手工安装文档有歧义&#xff0c;导致废了好长时间才安装好&#xff0c;记录一下 一、手工安装 安装好mysql&#xff0c;新建一个数据库作为hedgedoc的数据库在hedgedoc官网下载tar包&#xff0c;将tar包复…

UMA 2 - Unity Multipurpose Avatar☀️六.Advanced Occlusion高级遮挡功能解决皮肤服饰穿模

文章目录 🟥 本节功能效果展示🟧 基础项目配置🟨 本节项目配置🟩 配置MeshHideAsset1️⃣ 创建MeshHideAsset2️⃣ 配置SlotDataAsset3️⃣ 配置遮挡信息🟦 将 MeshHideAsset 配置到 Recipe🟥 本节功能效果展示 未遮挡前的穿模问题: 遮挡后效果:

Java“牵手”易贝商品列表数据,关键词搜索易贝商品数据接口,易贝API申请指南

ebay商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取ebay商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问ebay商城的网页来获取商品详情信息。以下是两种常用方法的介绍&…

基于SSM的蜀都天香酒楼管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

持续集成/技术交付全流程流水线工具的设计与落地

文章目录 持续集成/技术交付全流程流水线工具的设计与落地概述工具架构设计主要功能模块代码库Jenkins 流水线代码构建自动化测试产品部署监控报警 使用方法步骤一&#xff1a;安装 Jenkins步骤二&#xff1a;创建 Jenkins 流水线步骤三&#xff1a;配置监控报警步骤四&#xf…

BBR 带宽估计的延后累加

一个关于时延统计分布的小测试&#xff0c;用 netem delay jitter distribution pareto 模拟&#xff0c;得到下面的结果&#xff1a; netem 的 jitter 并不是真 jitter&#xff0c;只是通过延时阻滞部分报文模拟 jitter&#xff0c;对保序流而言&#xff0c;就表现为乱序&am…

Java中wait和notify详解

线程的调度是无序的&#xff0c;随机的&#xff0c;但是也是有一定的需求场景&#xff0c;希望能够有序执行&#xff0c;join算是一种控制顺序的方式&#xff08;功能有限&#xff09;——》一个线程执行完&#xff0c;才能执行另一个线程&#xff01; 本文主要讲解的&#xf…