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集合类是泛 ...
随机推荐
- IIS 连接 oracle报Oracle.DataAccess版本错误解决办法
通过IIS连接oracle时报“Could not load file or assembly 'Oracle.DataAccess, Version=2.112.3.0, Culture=neutr ...
- 如何使用其他文件中定义的类Python
我在文件a.py中定义了一个类class A(object),现在想在b.py中的类B中某个函数中创建一个A的对象,需要如何操作呢? 我在b的头加了import a.py然后使用语句 obj = A( ...
- Xamarin的不归路-安卓模拟器启动慢&没有虚拟键盘
1.启动慢解决方案:参考这篇文章进行配置 http://www.360doc.com/content/13/1002/18/532901_318605525.shtml 2.模拟器没有虚拟键盘解决方案 ...
- 热门的PHP框架
每个PHP框架都拥有各自独特的地方.同时PHP语言已经获得了巨大的认同并且成为了世界上最通用的服务器脚本语言.PHP也俨然成为了最容易学习的web动态开发语言.在PHP发展的同时,PHP框架也迅速崛起 ...
- java基本类型的默认值及其取值范围
- 参加MVP OpenDay 和2015 MVP Community Camp社区大课堂
微软MVP Openday 1月30日在北京召开,到时全国上百位 MVP 专家将齐聚北京.当然还有亚太的其他国家地区的MVP 也会来北京,1月31日微软 MVP 项目组主办的年度微软技术社区分享大会- ...
- C#动态编译引擎-CS-Script
什么是CS-Script? CS-Script是一种以CLR(公共语言运行库)为基础的脚本系统,它使用ECMA标准的C#作为编程语言,它面向微软的CLR运行库(.net 2.0/3.0/3.5/4.0 ...
- TaintDroid剖析之File & Memiry & Socket级污点传播
TaintDroid剖析之File & Memiry & Socket级污点传播 作者:简行.走位@阿里聚安全 1.涉及到的代码文件 TaintDroid在File, Memory以及 ...
- Redis分布式锁服务(八)
阅读目录: 概述 分布式锁 多实例分布式锁 总结 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (ob ...
- Emacs 配置文件
以下是我整理的 emacs 配置文件,供刚开始玩 emacs 的同学参考.网上有人说:emacs 是神的编辑器,如果能够用到这样的编辑器,那这个人就是神了.从我个人的经验来看,emacs 是一把利器, ...