iOS NSSet 学习 “无序数组” & 去重 案例

NSSet,NSMutableSet,NSCountedSet类声明编程接口对象的无序集合(散列存储:在内存中的存储位置不连续)。

而NSArray,NSDictionary类声明编程接口对象的有序集合(有序存储:在内存中的存储位置连续)。”

NSSet 运用 hash(哈希)散列算法 查找目标集合元素比NSArray快

特点:无序性(但是可以做有序化操作),确定性,差异性(互异性) 

举例一个简单的使用场景:

去重:

NSMutableArray KVO  NSMutableArray NSSet  NSOrderedSet 各种方法 比较

结论:随着数据量增加 都比 NSMutableArray 快~

    NSArray *array = @[@1,@2,@3,@4,@4,@5,@2,@2];
    
    //NSMatableArray 去重结果: 1 2 3 4 5  有序 在 array 里面相对的顺序的"有序"
    NSMutableArray *resultArray = [NSMutableArray array];
    for (NSNumber *num  in array) {
        if (![resultArray containsObject:num]) {//判断该集合元素否存在
            [resultArray addObject:num];
        }
    }
    NSLog(@"resultArray :%@",resultArray);
    
    //KVC容器操作
    //容器不仅仅能使用KVC方法实现对容器成员传递普通的操作消息,KVC还定义了特殊的一些常用操作,使用valueForKeyPath:结合操作符来使用
    //这里使用对象操作符:
    //@distinctUnionOfObjects、@unionOfObjects
    //@distinctUnionOfObjects操作符返回被操作对象指定属性的集合并做去重操作,而@unionOfObjects则允许重复。如果其中任何涉及的对象为nil,则抛出异常。
    //去重结果  : 5 1 2 3 4 无序
    NSArray *values = [array valueForKeyPath:@"@distinctUnionOfObjects.self"];
    NSLog(@"value   : %@",values);
 
    
    //没使用 NSSet 前 其实我是会使用字典的 字典的特点 也是无序键值对 效率也是优于使用数组排重的.
    //无序结果  :3,2,5,1,4
    NSMutableDictionary *numDictionary = [NSMutableDictionary dictionary];
    for (NSNumber *num  in array) {
        [numDictionary setObject:num forKey:num];
    }
    NSLog(@"numDictionary all keys : %@",numDictionary.allKeys);
    
    
    //NSSet 去重结果  : 5 1 2 3 4  无序
    NSSet *numSet = [[NSSet alloc]initWithArray:array];
    NSLog(@"numSet Array : %@",numSet.allObjects);
    
    //NSSet 有序化操作 : 1 2 3 4 5 同上面的"有序"
    NSOrderedSet *orderNumSet = [NSOrderedSet orderedSetWithArray:array];
    NSLog(@"orderNumSet Array : %@",orderNumSet.array);
    
    //KVO 容器对象操作符 distinctUnionOfObjects
    //3,2,5,1,4  无序
    
    NSSet *setValues = [numSet valueForKeyPath:@"@distinctUnionOfObjects.self"];
    NSLog(@"setValues  : %@",setValues);

 

NSSet 具体使用 :

http://www.cnblogs.com/GISerYang/p/3340937.html

转载于:https://www.cnblogs.com/someonelikeyou/p/5795090.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值