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

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

        //创建一个含有重复对象的数组
        NSArray * test1  = @[@1,@1,@1,@4,@5];
        
        //通过转换数组来创建集合(NSSet)对象 testSet1
        NSSet * 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]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Objective-C是一面向对象的编程语言它是基于C语言的扩展虽然Objective-C本身并没有提供红黑树的实现,但可以通过使用Foundation框架中的NSSet类来实现类似红黑树的功能[^2]。 NSSet是Foundation框架中的一个集合类,它可以存储一组无序且唯一的对象。NSSet内部的实现可能使用了红黑树等数据结构来提高查询速度。 下面是一个使用Objective-C实现红黑树的示例代码: ```objective-c #import <Foundation/Foundation.h> @interface RedBlackTree : NSObject - (void)insertValue:(NSNumber *)value; - (BOOL)containsValue:(NSNumber *)value; @end @implementation RedBlackTree { NSMutableSet *_set; } - (instancetype)init { self = [super init]; if (self) { _set = [NSMutableSet set]; } return self; } - (void)insertValue:(NSNumber *)value { [_set addObject:value]; } - (BOOL)containsValue:(NSNumber *)value { return [_set containsObject:value]; } @end int main(int argc, const char * argv[]) { @autoreleasepool { RedBlackTree *tree = [[RedBlackTree alloc] init]; [tree insertValue:@5]; [tree insertValue:@3]; [tree insertValue:@8]; NSLog(@"Contains 5: %@", [tree containsValue:@5] ? @"Yes" : @"No"); // 输出:Contains 5: Yes NSLog(@"Contains 7: %@", [tree containsValue:@7] ? @"Yes" : @"No"); // 输出:Contains 7: No } return 0; } ``` 在上面的示例代码中,我们创建了一个RedBlackTree类,它使用NSMutableSet来存储红黑树的节点。insertValue方法用于插入一个值,containsValue方法用于检查某个值是否存在于红黑树中。 请注意,这只是一个简单的示例,实际上红黑树的实现要复杂得多。如果需要更复杂的红黑树功能,建议使用第三方库或自行实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值