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
|
//初始化NSMutableArray NSMutableArray *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
|
//初始化NSMutableArray NSMutableArray *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] aaa 2014-08-01 17:44:20.769 HelloOC[1520:303] bbb 2014-08-01 17:44:20.770 HelloOC[1520:303] 222 2014-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 => value3 2014-08-01 20:28:37.504 HelloOC[1786:303] key1 => value1 2014-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里面的元素的个数为:4 2014-08-02 09:47:39.555 HelloOC[608:303] CC 2014-08-02 09:47:39.555 HelloOC[608:303] AA 2014-08-02 09:47:39.555 HelloOC[608:303] BB 2014-08-02 09:47:39.555 HelloOC[608:303] 随机获取其中的值cc 2014-08-02 09:47:39.556 HelloOC[608:303] set1 != set2 2014-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" ]; //遍历Set NSArray *setArray = [mutableSet1 allObjects]; array_display(setArray); |
运行结果:
1
2
|
2014-08-02 10:18:34.844 HelloOC[701:303] aaa 2014-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集合类是泛 ...
随机推荐
- java的基础知识运算符
一.运算符. 1.算数运算符:+,-,*,/,% 2.自增自减 :++ ,-- ++在前 先运算在赋值 ++在后 先赋值后运算 -- 减减同上. 3.赋值运算符 : = ,+=,-=,*=,/= 4. ...
- ruby开发环境配置
环境:win7 64位 软件:Ruby2.2.5,devkit对应版本,rubygems,rails 一:安装Ruby 1.在这个网站:http://rubyinstaller.org/downloa ...
- Nginx反向代理和负载均衡
一.Nginx反向代理设置 从80端口转向其他端口反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的 ...
- Torch7学习笔记(一)CmdLine
该类主要为了提供一种方便解析参数的框架,对于每个实验尤其是神经网络中要调参数上.同时还可以把输出重定向到log文件中. 一般用法: cmd = torch.CmdLine() cmd:text() c ...
- 正则表达式在python中的应用
一.常用符号 . :匹配任意字符,换行符\n除外 * :匹配前一个字符0次或无限次 ? :匹配前一个字符0次货1次 .* :贪心算法 .*? :非贪心算法 () :括号内的数据作为结果返回 ...
- 如何使用其他文件中定义的类Python
我在文件a.py中定义了一个类class A(object),现在想在b.py中的类B中某个函数中创建一个A的对象,需要如何操作呢? 我在b的头加了import a.py然后使用语句 obj = A( ...
- vue-cli 路由 实现类似tab切换效果(vue 2.0)
1,更改main.js 2,在App.vue中,写入两个跳转链接(router-link),分别跳转到"home""About" (home.About即分别是 ...
- Javascript初学篇章_6(BOM)
BOM 浏览器对象模型 BOM (浏览器对象模型),它提供了与浏览器窗口进行交互的对象 一.window对象 Window对 象表示整个浏览器窗口. 1.系统消息框 alert() alert('he ...
- 仿JQ基础架构,可扩展。
(function(win,doc,fn){ var events = [];//拷贝核心方法 var publicEvent = ["extend","f ...
- Android控件之Notification
Android通知就是让设备在屏幕最顶上那栏里面显示图标,当滑下通知栏之后可以看到列表状的通知选项,有些是"通知"类型的,有些是"正在运行"类型的," ...