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

iOS NSSet 学习 “无序数组” & 去重 案例的更多相关文章

  1. Javascript学习记录——数组去重

    var arr = [1, 2, 3, 5, 5, '45', '45', 4, 1, '1', '2'] for (var i = 0; i < 10000; i++) { arr.push( ...

  2. iOS 基础之NSArray数组去重

    1.面试题 现在有一个数组arr1,它里面存储的字符串分别为@“zhangsan”@“lisi”@“wangwu”@“lisi”@“zhangsan”,请将它去重后赋值给可变数组arr2输出为:@“z ...

  3. JS学习笔记——数组去重

    <script type="text/javascript"> //indexOf"是ECMAScript5方法,IE8以下不支持,需多写兼容低版本浏览器代码 ...

  4. iOS数组去重的方法,超级简单

    //最近新发现的一个数组去重,用不着循环,一句代码搞定 //去除数组中重复的 NSArray *oldArr = @[@"1",@"2",@"3&qu ...

  5. JavaScript学习系列博客_28_JavaScript 数组去重

    数组去重 var arr = [1,2,3,2,2,1,3,4,2,5]; //去除数组中重复的数字 //获取数组中的每一个元素 for(var i=0 ; i<arr.length ; i++ ...

  6. 开源中国iOS客户端学习

    开源中国iOS客户端学习 续写前言 <开源中国iOS客户端学习>续写前系列博客    http://blog.csdn.net/column/details/xfzl-kykhd.html ...

  7. 也谈面试必备问题之 JavaScript 数组去重

    Why underscore (觉得这部分眼熟的可以直接跳到下一段了...) 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. ...

  8. javascript小实例,多种方法实现数组去重问题

    废话不多说,直接拿干货! 先说说这个实例的要求:写一个方法实现数组的去重.(要求:执行方法,传递一个数组,返回去重后的新数组,原数组不变,实现过程中只能用一层循环,双层嵌套循环也可写,只做参考): 先 ...

  9. php中foreach()函数与Array数组经典案例讲解

    //php中foreach()函数与Array数组经典案例讲解 function getVal($v) { return $v; //可以加任意检查代码,列入要求$v必须是数字,或过滤非法字符串等.} ...

随机推荐

  1. quantz入门和使用流程(转载)

    1.下载地址:http://quartz-scheduler.org/downloads/catalog http://quartz-scheduler.org/downloads/destinati ...

  2. Appium python自动化测试系列之元素的定位(六)

    ​6.1 常用定位方法讲解 对象定位是自动化测试中很关键的一步,也可以说是最关键的一步,毕竟你对象都没定位那么你想操作也不行.所以本章节的知识我希望大家多动手去操作,不要仅仅只是书本上的知识,毕竟这个 ...

  3. Spring MVC生成JSON数据

    以下示例演示如何使用Spring Web MVC框架生成JSON数据格式.首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发基于动态表单的Web应用程序: ...

  4. Java凝视分类

    Java凝视分类 1.单行凝视    //打印结果    System.out.println("结果是:"+result); 2.多行凝视    /**     * @autho ...

  5. UML Rose2003完美破解攻略

    Rational Rose 2003 软件project画图软件 ,当然还不止画图,对于那些不想用英文版Rational Rose2003的同志们.这个Rational Rose2003 版本号已经汉 ...

  6. NDK,在JNI层使用AssetManager读取文件

    NDK,二进制文件数据读取,在JNI层,通过AAssetManager读取asset内部的资源: 需要头文件的支持 #include <android/asset_manager_jni.h&g ...

  7. PHP中通过数组遍历找出最小值

    举例: $a = array(1,2,4,0,9,8,6);//定义一个数组 $len = count($a);//获取数组的长度 $min = $a[0];//默认情况下数组的第一个值是最小的 fo ...

  8. 构造方法与构造块的执行顺序(区别于static)

    小面试题:在类的实例化时,会调用类的构造块(类中的构造块)和构造方法,无论构造方法在前还是在后,都先执行构造块 class Person{ public Person(){ System.out.pr ...

  9. JQuery实现动态生成树形菜单

    jQuery实现动态生成树形菜单 有一个需求:菜单导航条需要依据不同的权限动态提取出来.计划是将功能模块与用户权限之间的关系保持到一个配置表中.所以功能菜单的话就需要动态提取出来再显示.借助jquer ...

  10. 1677 treecnt(贡献)

    1677 treecnt 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给定一棵n个节点的树,从1到n标号.选择k个点,你需要选择一些边使得这k个点通过选择的边联 ...