Set使用详情

1. Set的概念

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

2.Set集合的三个特性

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

3.创建Set

Swift的集合类型写做Set,这里的Element是Set要储存的类型.不同与数组,集合没有等价的简写.
使用初始化器语法来创建一个确定类型的空Set;
使用数组字面量创建Set

  var letters = Set<Character>()
        letters.insert("c")
        print(letters)
var course: Set<String> = ["Match","English","History"]
    course.insert("History")
    print(course)

4.Set类型的哈希值

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

//错误的方式
struct Person{
    
    var name:String
    var age:Int
}

var personSet = Set<Person>()//Type 'Person' does not conform to protocol 'Hashable'

personSet.insert(Person(name: "zhangSan", age: 18))
//正确的方式
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: 18))

5.遍历Set

可以使用For-in遍历Set
因为Set是无序的,如果要顺序遍历Set,使用sorted()方法

 var courses: Set = ["Match","English","History"]
        
        //没有顺序的遍历
        for course in courses {
            
            print(course)
        }
        
        //一定顺序的遍历
        for course in courses.sorted() {
            
            print(course)
        }

6.添加元素

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

7.移除元素

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

8.基本Set操作的定义

1.intersection(:)交集,由属于A且属于B的相同元素组成的集合,记作A∩B(或B∩A);
2.union(
:)并集,由所有属于集合A或者属于集合B的元素所组成的集合,记作A∪B(或B∪A);
3.symmetricDifference(:)对称差集,集合A与集合B的对称差集定义为集合A与集合B中所有不属于A∩B的元素的集合;
4.subtract(
:)相对补集,由属于A而不属于B的元素组成的集合,称为B关于A的相对补集,记作A-B或A\B.
在这里插入图片描述



        let set: Set<Character> = ["A","B","C"];
        let set2: Set<Character> = ["B","E","F","G"]
        print(set.intersection(set2))//["B"]
        print(set.union(set2))//["A", "C", "B", "G", "F", "E"]
        print(set.symmetricDifference(set2))//["A", "C", "G", "F", "E"]
        print(set.subtracting(set2))//["C", "A"]

isSubset(of: ) 判断是否是另一个Set或者Sequence的子集
isSuperset(of: ) 判断是否是另一个Set或者Sequence的超集
isStrictSubset(of: )和isStrictSuperset(of: ) 判断是否是另一个Set的子集或者超集,但是又不等于另一个Set.
isDisjoint(with: ) 判断两个Set是否有公共元素,如果没有返回true,如果有返回false.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值