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集合类是泛 ...
随机推荐
- libCURL开源库在VS2010环境下编译安装,配置详解
libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...
- browsersync实现网页实时刷新(修改LESS,JS,HTML时)
var gulp = require("gulp"), less = require("gulp-less"), browserSync = require(& ...
- 在一定[min,max]区间,生成n个不重复的随机数的封装函数
引:生成一个[min,max]区间的一个随机数,随机数生成相关问题参考→链接 var ran=parseInt(Math.random()*(max-min+1)+min); //生成一个[min,m ...
- 【LabVIEW技巧】路径依赖解除方法
前言 LabVIEW程序开发,让我们的程序设计变的简单容易,但是设计过程中也不乏大量的重复性工作,其中最让人头痛的莫过于依赖冲突问题. 事实上,只要你对文件进行了修改或者移动,必不可少的依赖冲突就会产 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
- checkbox选中状态不被改变
让它的状态只能看不能改变,加上onclick="return false;". 也可以disabled="true";但是这个颜色变淡了; <input ...
- SQL Server2008附加数据库之后显示为只读时解决方法
啰嗦的话就不多说了,直入主题吧! 方案一: 碰到这中情况一般是使用的sa账户登录的,只要改为Windows身份验证,再附加数据库即可搞定. 方案二: 使用sa登录SQL Server2008附加数据库 ...
- NLP--十项沟通前的思想准备
如何达到有效沟通?sino NLP课程给我们十项针对沟通前的思想准备,可让我们了解怎样做到效果卓越的沟通: 1.建立和谐气氛. 这是有效沟通的前提条件,只有首先建立一个和谐的气氛,双方才能彼此敞开心扉 ...
- 学习笔记:java线程安全
首先得明白什么是线程安全: 线程安全是编程中的术语,指某个函数 (计算机科学).函数库在多线程环境中被调用时,能够正确地处理各个线程的局部变量,使程序功能正确完成. 这是维基百科里的资料,看完后还不是 ...
- HTML5- Canvas入门(六)
已经第六章了,也差不多接近尾声,如果你从第一章耐心follow到本章结束,那你便能掌握canvas的大部分知识点(当然如果要精通,还是得多靠练习,做一些小案例). 今天我们要学习的是canvas的变形 ...