当前位置: 代码迷 >> 综合 >> Objective-C学习-NSSet(集合),NSMutableSet(可变集合) NSCountSet(计数集合)
  详细解决方案

Objective-C学习-NSSet(集合),NSMutableSet(可变集合) NSCountSet(计数集合)

热度:12   发布时间:2024-01-04 06:39:34.0

       NSSet集合对象是用来干什么的呢,在之前做的demo和项目中很少用,但并不是代表不好用,在追求效率方面NSSet要比NSArray要高的多,因为他的查找是通过Hash(哈希)查找,自然会比数组遍历要快的多,而且它不允许里面存在重复的对象,因此多用来去除重复,打个比方例子如下

        //创建一个含有重复对象的数组NSArray * test1  = @[@1,@1,@1,@4,@5];//通过转换数组来创建集合(NSSet)对象 testSet1NSSet * testSet1 = [NSSet setWithArray:test1];//此时testSet1 = {(@5,@1,@4)}

        为什么楼主会想写这么一篇介绍NSSet的文章,是之前只是了解了一下这个类以及作用,但最近遇到一个面试题,就是说通过面向对象的思维处理两个数组,将两个数组里面不同的数字取出来

        当然最一般的就是通过两个for循环,但是通过for循环遍历两个数组来判定的时间复杂度为O(n^2),如果有4个数组,并且每个数组中有100000个元素呢,那么这种算法很明显会很差劲,而且这样算是面向过程的,而且这样做绝对不是最优算法,在objc中去除重复首先必然会想到一个类,就是NSSet,先来看看解决方案如何

        NSArray * array1 = @[@1,@2,@3,@4];NSArray * array2 = @[@2,@3,@4,@5];//根据数组实例化两个集合对象NSSet * set1 = [NSSet setWithArray:array1];NSSet * set2 = [NSSet setWithArray:array2];//根据集合对象创建两个可变集合对象NSMutableSet * set3 = [NSMutableSet setWithSet:set1];NSMutableSet * set4 = [NSMutableSet setWithSet:set2];//调用方法,表示在前者的 集合set对象中 消除 后者集合set对象 中存在的元素[set3 minusSet:set2];//此时set3 = {(@1)}[set4 minusSet:set1];//此时set4 = {(@5)}NSMutableSet * set5 = [NSMutableSet set];//表示在 set5对象中 添加 set3中存在并且set5中不存在的 元素[set5 unionSet:set3];//此时set5 = {(@1)}[set5 unionSet:set4];//此时set5 = {(@1,@5)}//获得set对象中的所有元素NSArray * array = [set5 allObjects];//array = @[@1,@5]