Object C学习笔记12-集合
这里讲到的集合是指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:@"", @"", @"",nil];
NSSet *setItem2=[NSSet setWithObjects:@"",@"", nil];
NSSet *setItem3=[NSSet setWithObjects:@"",@"", @"",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:]; NSNumber *number1=[NSNumber numberWithInteger:];
NSNumber *number2=[NSNumber numberWithInt:];
NSNumber *number3=[NSNumber numberWithInt:];
[muSet addObject:number1];
[muSet addObject:number2];
[muSet addObject:number3]; NSArray *nsArray=[NSArray arrayWithObjects: [NSNumber numberWithInt:],[NSNumber numberWithInt:],[NSNumber numberWithInt:], nil];
[muSet addObjectsFromArray:nsArray]; for(NSNumber *item in muSet){
NSLog(@"^^^^^^%d",item);
}
addObject 方法用于往NSMutableSet集合中添加元素,每次只能添加一个元素。
而addObjectsFromArray方法则用于将一个数组添加到NSMutableSet集合中
(3) 删除集合中的元素
[muSet removeObject:[NSNumber numberWithInt:]];
for(NSNumber *item in muSet){
NSLog(@"-----^%d",item);
}
[muSet removeAllObjects];
int leng=[muSet count];
NSLog(@"00000-%d",leng);
使用removeObject方法用于删除NSMutableSet集合中的元素,在以上代码中删除一个值为2的NSNumber对象。
而使用removeAllObjects方法则用于删除NSNutableSet中的所有的元素,最后一行代码输出的结果0。
(4)其他方法介绍
- (void)unionSet:(NSSet *)other;用于向集合中添加另外一个集合的所有元素
- (void)minusSet:(NSSet *)other;用于删除other中包含的元素
Set集合与Array比较类似,更多方法可以查看官方API文档。
Object C学习笔记12-集合的更多相关文章
- Ext.Net学习笔记12:Ext.Net GridPanel Filter用法
Ext.Net学习笔记12:Ext.Net GridPanel Filter用法 Ext.Net GridPanel的用法在上一篇中已经介绍过,这篇笔记讲介绍Filter的用法. Filter是用来过 ...
- Java学习笔记之---集合
Java学习笔记之---集合 (一)集合框架的体系结构 (二)List(列表) (1)特性 1.List中的元素是有序并且可以重复的,成为序列 2.List可以精确的控制每个元素的插入位置,并且可以删 ...
- Object C学习笔记24-关键字总结
学习Object C也有段时间了,学习的过程中涉及到了很多Object C中的关键字,本文总结一下所涉及到的关键字以及基本语法. 1. #import #import <> 从syste ...
- Object C学习笔记17-动态判断和选择器
当时学习Object C的时被人鄙视了一顿,说使用.NET的思想来学Object C就是狗屎:不过也挺感谢这位仁兄的,这让我学习的时候更加的谨慎.今天的学习笔记主要记录Object C中的动态类型相关 ...
- Object C学习笔记24-关键字总结(转)
学习Object C也有段时间了,学习的过程中涉及到了很多Object C中的关键字,本文总结一下所涉及到的关键字以及基本语法. 1. #import #import <> 从syste ...
- SpringMVC:学习笔记(12)——ThreadLocal实现会话共享
SpringMVC:学习笔记(12)——ThreadLocal实现会话共享 ThreadLocal ThreadLocal,被称为线程局部变量.在并发编程的情况下,使用ThreadLocal创建的变量 ...
- Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点
Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...
- 软件测试之loadrunner学习笔记-02集合点
loadrunner学习笔记-02集合点 集合点函数可以帮助我们生成有效可控的并发操作.虽然在Controller中多用户负载的Vuser是一起开始运行脚本的,但是由于计算机的串行处理机制,脚本的运行 ...
- Object C学习笔记22-#define 用法
上一篇讲到了typedef 关键字的使用,可以参考文章 Object C 学习笔记--typedef用法 .而在c中还有另外一个很重要的关键字#define. 一. #define 简介 在C中利用预 ...
- Object C学习笔记21-typedef用法
在上一章的学习过程中遇到了一个关键字typedef,这个关键字是C语言中的关键字,因为Object C是C的扩展同样也是支持typedef的. 一. 基本作用 typedef是C中的关键字,它的主要作 ...
随机推荐
- JSON学习笔记-5
JSON.parse() 1.从服务器接受数据进行解析(一般是字符串) 2.解析前要确保你的数据是标准的 JSON 格式,否则会解析出错.可以使用线工具检测:https://c.runoob.com/ ...
- 团队项目个人进展——Day02
一.昨天工作总结 冲刺第二天,昨天成功接入高德地图接口,并通过官方提供的文档实现了地图定位功能,通过官方在GitHub上提供的Demo可以看出还能实现天气查看,路径规划等功能: 二.遇到的问题 虽然通 ...
- 配置 tsconfig.json
作用 指导编译器如何生成 JS 文件 参数 target: 编译目标平台(es3, es5, es2015) module: 组织代码方式(commonjs, AMD) sourceMap:编译文件对 ...
- shell_processing
1.文本处理_2:grep,sed,awk 2.regular_expression 3.Test 一.文本处理_2 1.grep --Linux处理正则表达式的主要程序.正则表达式是一种符号表示 ...
- LeetCode题解之Flipping an Image
1.题目描述 2.题目分析 使用C++的迭代器 3.代码 vector<vector<int>> flipAndInvertImage(vector<vector< ...
- 从MySQL向Greenplum集群中导入数据
我们要从MySQL当中导出数据到Greenplum当中,按照以下步骤就可以 1:将MySQL当中的表导出外部文件 以schema_name.table_name为例 select product_id ...
- UIView的无损截图
UIView的无损截图 说明 1. 烂大街的代码 2. 写成category后,方便直接从drawRect中获取绘制出来的图片 3. 可以直接绘制图片供按钮设置背景图片用 4. 无损截图(包括alph ...
- php算法基础----时间复杂度和空间复杂度
算法复杂度分为时间复杂度和空间复杂度. 其作用: 时间复杂度是指执行算法所需要的计算工作量: 而空间复杂度是指执行这个算法所需要的内存空间. (算法的复杂性体现在运行该算法时的计算机所需资源的多少上, ...
- 硬盘上的一些算法小题目||and今天看了下林锐的书以及gdb调试 及一些变成算法小题目
gdb调试:观察点,断点,事件捕捉点.step 进入函数,next 跳过函数,until 跳出循环,finish 结束函数 林锐:书后试题 & c++的对象模型图 看了二叉树的非递归遍历, 链 ...
- css画图那些事
上一篇css3写了一些基本的图形,想到是不是能用css3画个动物,便在网上找图片.于是选中一只大鹏鸟 也不难,一步步的写出身体部位,再定位上去就好了.来一张效果图,后面给两个加了动画,稍微难看一点,后 ...