Objective-C中的集合类
下面详细的介绍Objective-C中的集合类以及每个集合类的用法,学过其他面向对象编程语言的小伙伴们看到OC的集合类会有种莫名的亲切感,理解起来问题不大,可以类比Java中的集合类去学习。 在Objective-C中的集合类中主要包括不可变的数组--NSArray, 可变的数组--NSMutableArray, 不可变的字典--NSDictionary, 可变的字典--NSMutableDictionary, 不可变的集合--NSSet,可变的集合--NSMutableSet。
一、数组
1.不可变的数组 NSArray
数组是有序对象的集合,用来存储对象的有序列表,在OC中数组中必须存的是对象,不能是基本数据类型,若想存入基本数据类型,必须先把数据类型转换成对象,然后再存入集合类中。 NSArray也是OC中的一个对象,使用NSArray也需要进行实例化,前面的博客在类的初始化中提到了便利初始化函数和便利构造器,在NSArray中也少不了这两样东西我们可以通过NSArray的便利初始化函数或者便利构造器进行NSArray的实例化和初始化工作。
(1)NSArray的初始化
NSArray的便利初始化函数: -(id) initWithObjects : (id) firstObject, ....;
NSArray的便利构造器: +(id) arrayWithObjects: (id) firstObject, ...;
demo:
|
1
2
3
4
|
//NSArray的便利初始化NSArray *array1 = [[NSArray alloc] initWithObjects:@"aaa", @"bbb", @"ccc", nil];//NSArray的便利构造器NSArray *array2 = [NSArray arrayWithObjects:@"111", @"222", @"333", nil]; |
(2)获取数组元素的个数和数组的元素
-(NSUInteger) count; 获取数组元素的个数
-(id) objectAtIndex : (NSUInteger) index;
demo:
|
1
2
3
4
5
|
//获取数组元素的个数和元素int count = (int)[array1 count];//获取相应索引的元素id element = [array1 objectAtIndex:0];NSLog(@"array1_count = %d, array[0] = %@", count, element); |
运行结果:
|
1
|
2014-08-01 16:25:37.117 HelloOC[1285:303] array1_count = 3, array[0] = aaa |
(3)有了count和objectAtIndex我们就可以对数组进行元素的遍历啦
demo:
|
1
2
3
4
5
6
7
8
|
//封装遍历数组的函数void array_display(id array){ for (int i = 0 ; i < [array count]; i++) { id temp = [array objectAtIndex:i]; NSLog(@"%@", temp); }} |
2.可变数组:NSMutableArray
NSArray的容量是固定的,而NSMutableArray的容量是可变的,我们可以在NSMutableArray实例化的时候先初始化一个容量,不过这个容量不是固定的,不够的时候会自动增加。NSMutableArray是NSArray的子类,是对NSArray的一个扩充。
(1) NSMutableArray的初始化
NSMutableArray的便利初始化函数:-(id) initWithCapacity : (NSUInteger) numItems;
NSMutableArray的便利构造器:+(id) arrayWithCapacity: (NSUInteger) numItems;
demo:
|
1
2
3
4
|
//NSMutableArray的便利初始化NSMutableArray *array3 = [[NSMutableArray alloc] initWithCapacity:3];//NSMutableArray的便利构造器NSMutableArray *array4 = [NSMutableArray arrayWithCapacity:3]; |
(2)元素的添加和删除
增加元素: -(void) addObject: (id) anObject; --往数组的尾部添加元素
删除全部内容: -(void) removeAllObjects;
删除最后一个元素: -(void) removeLastObject;
通过索引删除元素: -(void) removeObjectAtIndex: (NSUInteger) index;
删除任意一个元素: -(void) removeObject : (id)object;
代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//初始化NSMutableArrayNSMutableArray *array = [NSMutableArray arrayWithObjects:@"111", @"222", @"333", nil];//添加元素[array addObject:@"444"];//移除元素[array removeObject:@"111"];//移除最后一个元素[array removeLastObject];//按照索引删除元素[array removeObjectAtIndex:0];array_display(array); |
运行结果:
|
1
|
2014-08-01 17:18:58.658 HelloOC[1467:303] 333 |
(3)元素的插入和替换
通过数组的索引来进行元素的替换:-(void) replaceObjectAtIndex :(NSUInteger) index withObject: (id) anObject;
在指定索引处插入对象:-(void) insertObject : (id) anObject atIndex : (NSUInteger) index;
demo:
|
1
2
3
4
5
6
7
8
9
10
|
//初始化NSMutableArrayNSMutableArray *array = [NSMutableArray arrayWithObjects:@"111", @"222", @"333", nil];//对指定位置的元素进行替换[array replaceObjectAtIndex:0 withObject:@"aaa"];//在相应的位置插入元素[array insertObject:@"bbb" atIndex:1];array_display(array); |
运行结果:
|
1
2
3
4
|
2014-08-01 17:44:20.769 HelloOC[1520:303] aaa2014-08-01 17:44:20.769 HelloOC[1520:303] bbb2014-08-01 17:44:20.770 HelloOC[1520:303] 2222014-08-01 17:44:20.770 HelloOC[1520:303] 333 |
4.数组的遍历
上面已经写了一种数组遍历方式,下面总结了其他的遍历方式,用枚举器(类似Java中的迭代器)和快速枚举(类似PHP中的foreach)
(1)枚举器(迭代器)的用法
要通过NSEnumerator来遍历数组首先得通过-(NSEnumerator *) objectEnumerator来得到枚举器;通过枚举其中的nextObject来获取对象
demo:如下
|
1
2
3
4
5
6
7
8
|
//迭代遍历数组//获取枚举器NSEnumerator *enumerator = [array objectEnumerator];//临时变量id obj;while (obj = [enumerator nextObject]) { NSLog(@"%@", obj);} |
(2)快速遍历法,相当于PHP中的foreach的用法
|
1
2
3
4
|
for(id obj in array){ NSLog(@"%@", obj);} |
5.对可变数组进行排序
//对数组进行排序
[arraymul sortUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2)
{
if ([obj1 compare:obj2] < )
{
NSLog(@"交换");
return ;
}
else
{
NSLog(@"不交换");
return -;
}
}];
二、字典(Dictionary)
字典就像java中的Map, 里面存的是键值对,key的值是不可以重复的。字典有可改变的和不和不可改变之分
1.不可变字典NSDictionary
(1)字典的创建和获取字典的值
|
1
2
3
4
|
//不可变字典的初始化NSDictionary *dictionay = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];id value = [dictionay objectForKey:@"key1"];NSLog(@"key1 => %@", value); |
代码运行结果:
|
1
|
2014-08-01 19:09:41.319 HelloOC[1658:303] key1 => value1 |
(2).字典的遍历
字典的遍历方法是通过字典里的-(NSArray *)allKeys获取所有的key存入数组中然后通过遍历数组获取key对应的value,封装成函数如下:
|
1
2
3
4
5
6
7
8
|
//封装遍历字典的函数void dictionary_display(id dictionay){ NSArray *keys = [dictionay allKeys]; for (id obj in keys) { NSLog(@"%@ => %@", obj, [dictionay objectForKey:obj]); }} |
2.可变字典NSMutableDictionary
在使用可变字典NSMutableDictionary时可以先给可变字典初始化一个空间,如果不够的话会自动增加
给可变字典分配初始化空间: +(id) dictionaryWithCapacity : (NSUInteger) num;
给可变字典添加对象:-(void) setObject(id) obj forKey(id) aKey;
根据关键字删除对象:-(void) removeObjectForKey : (id) aKey;
删除字典中的所有数据: -(void) removeAllObjects;
代码如下:
|
1
2
3
4
5
6
7
8
9
|
NSMutableDictionary *mulDictionary = [NSMutableDictionary dictionaryWithCapacity:3];//添加值[mulDictionary setObject:@"value1" forKey:@"key1"];[mulDictionary setObject:@"value2" forKey:@"key2"];[mulDictionary setObject:@"value3" forKey:@"key3"];[mulDictionary setObject:@"value4" forKey:@"key4"];//通过键删除值[mulDictionary removeObjectForKey:@"key4"];dictionary_display(mulDictionary); |
运行结果:
|
1
2
3
|
2014-08-01 20:28:37.504 HelloOC[1786:303] key3 => value32014-08-01 20:28:37.504 HelloOC[1786:303] key1 => value12014-08-01 20:28:37.504 HelloOC[1786:303] key2 => value2 |
三.Set集合
Set集合类就像我们数学中的集合一样是无序和不重复的,Set中也只能存放对象,也分为可变集合NSMutableSet和不可变集合NSSet。
1.不可变集合NSSet
(1)NSSet的初始化和其他集合类一样也有其对应的便利初始化方法和便利构造器,
便利初始化方法:-(id) initWithObjects: (id) firstObject, ...;
便利构造器:+(id) setWithObjects: (id) firstObject, ...;
(2)NSSet中也有-(NSUInteger) count 来获取元素的对象
(3) 获取集合中的元素
获取全部的集合元素,以数组的形式返回:-(NSArray *) allObjects;
随进获取集合中的元素:-(id) anyObject;
(4)判断两个Set是否相同 : - (BOOL) isEqualToSet: (NSSet *) otherSet;
(5)判断一个元素是否在本集合中 -(BOOL) member: (id) obj;
Demo:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
//set集合的操作//便利初始化函数NSSet *set1 = [[NSSet alloc] initWithObjects:@"aa", @"bb", @"cc", @"dd", nil];//便利构造器NSSet *set2 = [NSSet setWithObjects:@"AA", @"BB", @"CC", nil];//获取集合中元素的个数int count = (int) [set1 count];NSLog(@"set1里面的元素的个数为:%d", count);//遍历集合:把set集合转换为数组然后进行遍历NSArray *setToArray = [set2 allObjects];array_display(setToArray);//随机获取Set中元素id element = [set1 anyObject];NSLog(@"随机获取其中的值%@", element);//比较两个Set是否相等if ([set1 isEqualToSet:set2] == NO) { NSLog(@"set1 != set2");}//查看一个元素是否在一个set中if ([set1 member:@"aa"]) { NSLog(@"aa 在set1中");} |
运行结果为:
|
1
2
3
4
5
6
7
|
2014-08-02 09:47:39.554 HelloOC[608:303] set1里面的元素的个数为:42014-08-02 09:47:39.555 HelloOC[608:303] CC2014-08-02 09:47:39.555 HelloOC[608:303] AA2014-08-02 09:47:39.555 HelloOC[608:303] BB2014-08-02 09:47:39.555 HelloOC[608:303] 随机获取其中的值cc2014-08-02 09:47:39.556 HelloOC[608:303] set1 != set22014-08-02 09:47:39.556 HelloOC[608:303] aa 在set1中 |
2、可变Set: NSMutableSet
1.可变集合的实例化和初始化
便利初始化函数: -(id) initWithCapacity :(NSUInteger) numItems;
便利构造器:+(id) setWithCapacity: (NSUInteger) numItems;
2.往可变集合中添加元素
-(void) addObject : (id) object;
3.删除集合中的对象
-(void) removeAllObjects; 删除所有的对象;
-(void) removeObjects: (id) object 删除其中某一个对象;
demo:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//set可变集合//便利初始化函数分配大小NSMutableSet *mutableSet1 = [[NSMutableSet alloc] initWithCapacity:3];NSMutableSet *mutableSet2 = [NSMutableSet setWithCapacity:3];//添加元素[mutableSet1 addObject:@"aaa"];[mutableSet1 addObject:@"BBB"];[mutableSet1 addObject:@"bbb"];//删除元素[mutableSet1 removeObject:@"BBB"];//遍历SetNSArray *setArray = [mutableSet1 allObjects];array_display(setArray); |
运行结果:
|
1
2
|
2014-08-02 10:18:34.844 HelloOC[701:303] aaa2014-08-02 10:18:34.844 HelloOC[701:303] bbb |
四:把基本数据类型包装成对象
前面不止一次的提到在OC中的集合类中是不能放基本数据类型的,那么我们如何把基本数据类型封装成对象呢? 在OC中给我们提供啦一个类专门来把基本数据类型封装成对象,这个类就是NSNumber.
1. NSNumber的用法如下
把基本类型包装成对象的便利构造函数
-(id) initWithChar : (char) value;
-(id) initWithInt : (int) value;
-(id) initWithFloat : (float) value;
-(id) initWithBool: (BOOL) value;
把基本数据类型包装成对象的便利构造器
+(id) numberWithChar : (char) value;
+(id) numberWithInt : (int) value;
+(id) numberWithFloat : (float) value;
+(id) numberWithBool : (BOOL) value;
从NSNumber中获取值
-(char) charValue; -(int) intValue; -(float) floatValue; (BOOL) boolValue; (NSString *) stringValue;
2、在集合类中是不可以存储nil(空的),因为nil作为nil的结束符,那么我们如何来存储空对象呢?该NSNull出场啦,其功能是把null包装成对象,
+(NSNull *) null;
Objective-C中的集合类的更多相关文章
- 理解Objective C 中id
什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
- JUC集合之 JUC中的集合类
Java集合包 在"Java 集合系列01之 总体框架"中,介绍java集合的架构.主体内容包括Collection集合和Map类:而Collection集合又可以划分为List( ...
- objective C中的字符串NSStirng常用操作
objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...
- java中的集合类总结
在使用Java的时候,我们都会遇到使用集合(Collection)的时候,但是Java API提供了多种集合的实现,我在使用和面试的时候频 频遇到这样的“抉择” . :)(主要还是面试的时候) 久而久 ...
- 【转载】C#中ArrayList集合类使用Remove方法指定元素对象
ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,任何数据类型的变量都可加入到同一个ArrayList集合中,在Array ...
- 【转载】C#中ArrayList集合类使用Add方法添加元素
ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,任何数据类型的变量都可加入到同一个ArrayList集合中,因此使用Ar ...
- 【转载】C#中ArrayList集合类使用RemoveAt方法移除指定索引的元素
ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,任何数据类型的变量都可加入到同一个ArrayList集合中,在Array ...
- 【转载】C#中ArrayList集合类和List集合类的比较
List集合类和ArrayList集合类都是C#语言中用于存储集合数据的集合类,两者都可灵活的插入.删除以及访问元素等等.但List集合和ArrayList集合的差别还是挺大的,首先List集合类是泛 ...
随机推荐
- 通读AFN①--从创建manager到数据解析完毕
流程梳理 今天开始会写几篇关于AFN源码解读的一些Blog,首先要梳理一下AFN的整体结构(主要是讨论2.x版本的Session访问模块): 我们先看看我们最常用的一段代码: AFHTTPSessio ...
- html5地理位置定位功能小析
Geolocationd 基本原理1.GPS GPS基本原理是测量出已知位置的卫星到用户接收机之间的距离,然后综合多颗卫星的数据就可知道接收机的具体位置.适用于具备GPS功能的设备(1)优点:在 ...
- swfupload纠结bug总结
上传控件传到客户端的信息在IE7下乱码: 服务端 HttpUtility.UrlEncode,客户端 decodeURIComponent 上传大文件报404错: 用fiddler截取发现提示: 最可 ...
- OA(权限管理初步模块)
权限管理:一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少.权限管理几乎出现在任何系统里面,只要有用户和密码的系统. 根据权限管理的套路,我们一般从这三个角 ...
- android之volley学习
Volley是android的平台通信库,一个新的网络通信框架.Volley 的特点:适合数据量小,通信频繁的网络操作. 获取Volley git 工具使用:git clone https://and ...
- Devexpress EXCEL导出
#region EXCEL导出 /// <summary> /// EXCEL导出 /// </summary> /// <param name="saveFi ...
- Ajax的二次封装
function handleAjax(url,_data,method) { return ajax(url,_data,method).then(function (res) { if(res){ ...
- 20145337 GDB调试汇编堆栈过程分析
20145337 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...
- 安卓工具箱:color of Style
<?xml version="1.0" encoding="utf-8"?> <resources> <color name=&q ...
- 基于腾讯手Q样式规范Frozen UI
Frozen UI是一个开源的简单易用,轻量快捷的移动端UI框架.基于手Q样式规范,选取最常用的组件,做成公用离线包减少请求,升级方式友好,文档完善,目前全面应用在腾讯手Q增值业务中. css组件包括 ...