Object C学习笔记12-集合

2014-03-08 17:25 by 贺臣, 262 阅读, 0 评论, 收藏, 编辑

  这里讲到的集合是指Set集合,其实Array也是一种类型的集合。在Object C中提供了两个集合类NSSet和NSMutableSet。其实NSSet和NSArray性质一样,都是用于存储对象的。

  然而Array集合和Set集合还是有区别的,主要是在于Set集合的搜索速度要比Array速度要快,NSArray和NSMutableArray 是一种有序集合,其存储的值在内存中是连续的,而NSSet和NSMutableSet是无需集合,在内存中的存储方式是不连续的,在NSSet,NSMutableSet采用了hash算法,你懂的!

  

  一. NSSet集合

    刚才上面也简单的介绍了一下NSSet集合,NSSet集合是一种无序集合,使用hash算法来查找存储的值。通过hash算法可以直接查找到存储的地址,而有序集合需要遍历所有元素来查找数据。

    (1) 初始化NSSet集合

NSNumber *num=[NSNumber numberWithInteger:2345];
NSSet *set=[NSSet setWithObjects:@"abc",@"efg", num,nil];

    因为NSSet集合只能存储对象类型,如果要存储int,char,double 等基础类型,必须将这些转化为对象类型才能存储到NSSet集合中。第一行代码将数字转化为NSNumber数字对象。

    使用setWithObjects 来初始化一个NSSet集合,同样和NSArray一样,需要使用nil来标识集合的结束。

    (2) 使用count获取NSSet集合的长度

NSNumber *num=[NSNumber numberWithInteger:2345];NSSet *set=[NSSet setWithObjects:@"abc",@"efg", num,nil];NSLog(@"%d",[set count]);

    上面的代码输出结果为3,说明集合set中包含三个元素,注意最后的nil不包含在其中。同时NSSet可以同时存储不同类型的对象,上面的代码中就包含了NSString和NSNumber两种类型对象。

    (3) 使用containObject判断是否包含某个元素

NSNumber *num1=[NSNumber numberWithInteger:23];
bool flag=[set containsObject:num1];
NSLog(@"%i",flag);

    这段代码中重新声明了一个对象num1,containObject方法用于判断NSSet中是否包含特定的对象,返回值为bool。如果使用如上代码则则返回为NO,输出为0

    (4) 使用objectEnumerator将集合转化为迭代器

NSEnumerator *enumr=[set objectEnumerator];NSObject *item=[enumr nextObject];while(item!=nil){NSLog(@"%@",item);item=[enumr nextObject];}for(NSObject *obj in set){NSLog(@"%@",obj);}

    使用set调用objectEnumerator方法只会,就将集合转化为NSEnumerator类,而NSEnumerator类有一个很重要的方法nextObject,用于获取迭代器的下一个元素。直到迭代到最后一个元素。

    (5) 元素的比较

//比较两个集合NSSet *setItems1=[NSSet setWithObjects:@"123", @"234", @"456",nil];NSSet *setItem2=[NSSet setWithObjects:@"123",@"234", nil];NSSet *setItem3=[NSSet setWithObjects:@"123",@"234", @"456",nil];bool flag1=[setItems1 isEqualToSet:setItem2];bool flag2=[setItems1 isEqualToSet:setItem3];NSLog(@"flag1=%i",flag1);NSLog(@"flag2=%i",flag2);bool flag3=[setItem2 isSubsetOfSet:setItems1];NSLog(@"flag3=%i",flag3);bool flag5=[setItems1 isSubsetOfSet:setItem2];NSLog(@"flag5=%i",flag5);bool flag4=[setItem2 intersectsSet:setItem3];NSLog(@"flag4=%i",flag4);

集合的比较例子

    使用方法isEqualToSet用于判断两个集合元素是否一样,返回bool值。

    - (BOOL)isSubsetOfSet:(NSSet *)otherSet; 判断前者集合是不是后者的子集。在上面的例子中可以看到两个集合调用的主从关系,这里是有区别的。

    - (BOOL)intersectsSet:(NSSet *)otherSet;判断两个集合是否有交集,也就是两个集合是否有相同的元素。

  二. NSMutableSet动态集合

    NSMutableSet和之前的NSMutableArray数组一样,是可以动态添加和删除元素的。NSMutableSet是NSSet的一个子类。

    (1) setWithCapacity用于初始化NSMutableSet的容量,这里要注意容量并不等于存储的元素数量

NSMutableSet *muSet=[NSMutableSet setWithCapacity:10];

    以上代码就是初始化了一个容量为10的NSMutableSet集合,当往NSMutableSet中添加新的元素对象时候,如果数量超过10不会数组越界,因为NSMutableSet是当存储满之后容量自动扩充。

    (2) 往集合中添加对象元素

NSMutableSet *muSet=[NSMutableSet setWithCapacity:10];NSNumber *number1=[NSNumber numberWithInteger:344];NSNumber *number2=[NSNumber numberWithInt:34];NSNumber *number3=[NSNumber numberWithInt:545];[muSet addObject:number1];[muSet addObject:number2];[muSet addObject:number3];NSArray *nsArray=[NSArray arrayWithObjects: [NSNumber numberWithInt:2],[NSNumber numberWithInt:3],[NSNumber numberWithInt:4], nil];[muSet addObjectsFromArray:nsArray];for(NSNumber *item in muSet){NSLog(@"^^^^^^%d",item);}

集合NSMutableSet中添加元素

    addObject 方法用于往NSMutableSet集合中添加元素,每次只能添加一个元素。

    而addObjectsFromArray方法则用于将一个数组添加到NSMutableSet集合中

    (3) 删除集合中的元素

[muSet removeObject:[NSNumber numberWithInt:2]];for(NSNumber *item in muSet){NSLog(@"-----^%d",item);}[muSet removeAllObjects];int leng=[muSet count];NSLog(@"00000-%d",leng);

删除NSMutableSet集合中的元素

    使用removeObject方法用于删除NSMutableSet集合中的元素,在以上代码中删除一个值为2的NSNumber对象。

    而使用removeAllObjects方法则用于删除NSNutableSet中的所有的元素,最后一行代码输出的结果0。

    (4)其他方法介绍

    - (void)unionSet:(NSSet *)other;用于向集合中添加另外一个集合的所有元素

    - (void)minusSet:(NSSet *)other;用于删除other中包含的元素

    

  Set集合与Array比较类似,更多方法可以查看官方API文档。

转载于:http://www.cnblogs.com/qingyuan/p/3587342.html

转载于:https://www.cnblogs.com/wodehao0808/p/3592130.html

Object C学习笔记12-集合相关推荐

  1. Kotlin学习笔记12——数据类和密封类

    Kotlin学习笔记12--数据类和密封类 前言 数据类 在类体中声明的属性 复制 componentN 解构声明 密封类 尾巴 前言 上一篇,我们学习了Kotlin中的拓展,今天继续来学习Kotli ...

  2. HALCON 20.11:深度学习笔记(12)---语义分割

    HALCON 20.11:深度学习笔记(12)--- 语义分割 HALCON 20.11.0.0中,实现了深度学习方法. 本章解释了如何使用基于深度学习的语义分割,包括训练和推理阶段. 通过语义分割, ...

  3. MongoDB学习笔记~对集合属性的操作

    $unset清除元素 请注意在单个数组元素上使用$unset的结果可能与你设想的不一样.其结果只是将元素的值设置为null,而非删除整个元素.要想彻底删除某个数组元素,可以用$pull 和$pop操作 ...

  4. Object C学习笔记22-#define 用法

    上一篇讲到了typedef 关键字的使用,可以参考文章 Object C 学习笔记--typedef用法 .而在c中还有另外一个很重要的关键字#define. 一. #define 简介 在C中利用预 ...

  5. Linux学习笔记12——配置ftp、squid、Tomcat、Samba、MySQL主从

    Linux学习笔记12 Linux学习笔记12 配置FTP服务 配置pure-ftpd 开机启动 上传下载文件 配置vsftpd CentOS 70安装配置Vsftp服务器 搭好vsftp之后出现55 ...

  6. Python学习笔记:集合(set)

    Python学习笔记:集合(set) 1.集合概念 集合是互异元素的无序集合.类似于只有键没有值的字典. 2.创建集合 有两种方法创建集合:一个是利用set函数,一个是利用花括号创建集合字面量. 3. ...

  7. golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题

    golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...

  8. 台大李宏毅Machine Learning 2017Fall学习笔记 (12)Why Deep?

    台大李宏毅Machine Learning 2017Fall学习笔记 (12)Why Deep? 本博客整理自: http://blog.csdn.net/xzy_thu/article/detail ...

  9. R语言小白学习笔记12—概率分布

    R语言小白学习笔记12-概率分布 笔记链接 学习笔记12-概率分布 12.1 正态分布 12.2 二项分布 12.3 泊松分布 12.4 其他分布 笔记链接 学习笔记1-R语言基础. 学习笔记2-高级 ...

最新文章

  1. linux下svn客户端安装及环境配置
  2. php数组array_push()和array_pop()以及array_shift()函数
  3. 夯实基础,彻底掌握js的核心技术(四):ES5、ES6对象方法详解
  4. 2017.9.13 找硬币 失败总结
  5. 特斯拉明年会有100万辆自动驾驶出租车 你敢坐吗?
  6. 前端多次点击button_对于防止按钮重复点击的尝试详解
  7. 解决eclipse无法启动:Failed to create the Java Virtual Machine
  8. 如何虚拟打印PDF文件(Win7)
  9. Java全栈工程师必备技能_一个优秀的“全栈工程师”要具备哪些素质呢?
  10. 反向代理负载均衡之APACHE
  11. Eureka的自我保护机制
  12. linux系统怎么关闭屏保,Linux关闭屏保
  13. 新手必学:Linux配置WiFi网络连接
  14. 打印机驱动无法安装到计算机是,打印机驱动在电脑哪个位置 打印机驱动安装不上怎么办【详解】...
  15. ppt中如何合并流程图_PPT中流程图如何分支?
  16. 商宝项目服务器,可照搬实施的商超高可用方案:proxmox + haproxy 等
  17. QML基础:锚anchors
  18. 【CSS】grid和flex
  19. nrm 切换不同的源工具
  20. ArcGlobe三维开发之十八——纵断面图的绘制

热门文章

  1. 图解高内聚与低耦合,傻瓜都能看懂!
  2. 什么才是好代码、高质量代码?
  3. 如何设计一个良好的接口?
  4. docker化你的java应用(上)
  5. 一个简单案例,5 分钟看懂 Java Lamdba 表达式
  6. java try catch_Java中关于try、catch、finally中的细节分析
  7. grafana导入json文件没有数据_XAMPP客户端环境无法导入较大Mysql数据库文件的解决方法...
  8. 暖通空调系统全面水力平衡解决方案
  9. AI:大力出奇迹?Bigger is better?AI下一代浪潮?—人工智能的大语言模型(LLMs)的简介、发展以及未来趋势
  10. PuTTy:PuTTy的简介、安装、使用方法之详细攻略