Swift学习笔记(8)——集合Set

来源:互联网 发布:绥化关键词优化排名 编辑:程序博客网 时间:2024/06/06 03:35

集合(Sets)
集合(Set)用来存储相同类型并且没有确定顺序的值。
当集合元素顺序不重要时或者希望确保每个元素只出现一次时可以使用集合而不是数组。

1. 集合类型的哈希值

(1)可哈希化的类型能存储在集合中,该类型必须提供一个方法来计算它的哈希值。一个哈希值是Int类型的,相等的对象哈希值必须相同,比如a==b,因此必须a.hashValue == b.hashValue。
(2)Swift 的所有基本类型(比如String,Int,Double和Bool)默认都是可哈希化的,可以作为集合的值的类型或者字典的键的类型。
(3)如果是自定义的类型,需要让其符合Hashable协议。符合Hashable协议的类型需要提供一个类型为Int的可读属性hashValue。
(4)Hashable协议符合Equatable协议,所以遵循该协议的类型也必须提供一个”是否相等”运算符(==)的实现。这个Equatable协议要求任何符合==实现的实例间都是一种相等的关系。也就是说,对于a,b,c三个值来说,==的实现必须满足下面三种情况:
- a == a(自反性)
- a == b意味着b == a(对称性)
- a == b && b == c意味着a == c(传递性)

2.集合类型语法

Set< Element >

3.创建和构造一个空的集合

(1)通过构造器语法创建一个特定类型的空集合:

var letters = Set<Character>()print("letters is of type Set<Character> with \(letters.count) items.")// 打印 "letters is of type Set<Character> with 0 items."// 通过构造器,这里的letters变量的类型被推断为Set<Character>。

(2)如果上下文提供了类型信息

可以通过一个空的数组字面量创建一个空的Set

letters.insert("a")// letters 现在含有1Character 类型的值letters = []// letters 现在是一个空的 Set, 但是它依然是 Set<Character> 类型

4.用数组字面量创建集合

使用数组字面量来构造集合

var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]// favoriteGenres 被构造成含有三个初始值的集合

Set< String >:变量被声明为“一个String值的集合”
一个Set类型不能从数组字面量中被单独推断出来,因此Set类型必须显式声明
但是如果使用一个数组字面量构造一个Set并且该数组字面量中的所有元素类型相同,由于 Swift 的类型推断功能,可以不写Set的具体类型。

5.访问和修改一个集合

可通过Set的属性和方法来访问和修改一个Set。
(1)只读属性count
(2)布尔属性isEmpty
(3)insert(_:)方法:添加一个新元素。
(4)remove(_:)方法:删除一个元素。如果set的一个元素与该值相等,则删除该元素,并返回元素值;若不包含,返回nil。
(5)removeAll()方法:删除所有元素。
(6)contains(_:)方法:检查Set中是否包含一个特定的值。

6.遍历一个集合

(1)for-in循环
因为set是一个无序的集合类型,所以用for-in遍历出来的也是无序的。
(2)sorted()方法
将set中的元素按照特定顺序遍历,返回的是一个有序数组,这个数组的元素排列顺序由操作符’<’对元素进行比较的结果来确定。

对比:

for genre in favoriteGenres {    print("\(genre)")}// Classical// Jazz// Hip hop
for genre in favoriteGenres.sorted() {    print("\(genre)")}// prints "Classical"// prints "Hip hop"// prints "Jazz

7.基本集合操作

(1)intersection(_:)方法:根据两个集合中都包含的值创建的一个新的集合。(交集)
(2)symmetricDifference(_:)方法:根据在一个集合中但不在两个集合中的值创建一个新的集合。
(3)union(_:)方法:根据两个集合的值创建一个新的集合。(并集)
(4)subtracting(_:)方法:根据不在该集合中的值创建一个新的集合。

let oddDigits: Set = [1, 3, 5, 7, 9]let evenDigits: Set = [0, 2, 4, 6, 8]let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]oddDigits.union(evenDigits).sorted()// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]// 创建一个新集合:有两个集合中的所有数且有序oddDigits. intersection(evenDigits).sorted()// []// 创建一个新集合:拥有两集合中的相同元素且有序oddDigits.subtracting(singleDigitPrimeNumbers).sorted()// [1, 9]// 创建一个新集合:oddDigits集合元素中除去与singleDigitPrimeNumbers集合中相同的元素,且有序oddDigits. symmetricDifference(singleDigitPrimeNumbers).sorted()// [1, 2, 9]// 创建一个新集合:oddDigits中除去两集合的相同元素且有序

8.集合成员关系和相等

集合a是集合b的父集合,因为a包含了b中所有的元素。
集合b是集合a的子集合,因为属于b的元素也被a包含。
集合b和集合c彼此不关联,因为它们之间没有共同的元素。

(1)“是否相等”运算符(==):判断两个集合是否包含全部相同的值。
(2)isSubset(of:)方法:判断一个集合中的值是否也被包含在另外一个集合中。
(3)isSuperset(of:)方法:判断一个集合中包含另一个集合中所有的值。
(4)isStrictSubset(of:)或者isStrictSuperset(of:)方法:判断一个集合是否是另外一个集合的子集合或者父集合并且两个集合并不相等。
(5)使用isDisjoint(with:)方法:判断两个集合是否不含有相同的值(是否没有交集)。

let houseAnimals: Set = ["Dog", "Cat"]let farmAnimals: Set = ["Cow", "Chicken", "Sheep", "Dog", "Cat"]let cityAnimals: Set = ["Bird", "Mouse"]houseAnimals.isSubset(of: farmAnimals)// true// isSubset:判断houseAnimals是否被farmAnimals包含farmAnimals.isSuperset(of: houseAnimals)// true// isSuperset:farmAnimals是否包含houseAnimals中的所有元素farmAnimals.isDisjoint(with: cityAnimals)// true// isDisjoint:farmAnimals和cityAnimals集合中是否不含有相同的值
阅读全文
0 0