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集合类是泛 ...
随机推荐
- Linux上Tomcat部署JavaWeb项目
一.安装JDK 配置java的环境变量,修改/etc/profile文件:vi /etc/profile 然后按下字母i进入插入模式, shift+insert粘贴; esc退出编辑; :wq保存退出 ...
- Torch Problems: require some packages doesn't work
I've recently got a problem. require 'cutorch' doesn't work. But it was ok yesterday, although I hav ...
- Redis 的安装与使用(linux)
官方教程:http://www.redis.io/download 1.下载Redis # wget http://download.redis.io/releases/redis-3.0.4.tar ...
- win7安装oracle 时容易出的问题
Windows7下安装Oracle11G.10G,都会提示如下信息 正在检查操作系统要求... 要求的结果: 5.0,5.1,5.2,6.0 之一 实际结果: 6.1 检查完成.此次检查的总体结果为: ...
- C/C++_date&time
在标准C/C++中与日期和时间相关的数据结构 注意:年份是实际年份与 1900 的差值 我们可通过tm结构来获得日期和时间,tm结构在time.h中的定义如下: #ifndef _TM_DEFIN ...
- C语言内存分配
(1)代码区(text segment).存放CPU执行的机器指令(machine instructions).通常,代码区是可共享的 (即另外的执行程序可以调用它),因为对于频繁被执行的程序,只 ...
- VS轻松开发Node.js应用
PTVS开发团队又开发出一款可以在VS里编写Node.js应用程序的插件--NTVS(Node.js Tools for Visual Studio),开发者可以在VS里轻松开发Node.js应用. ...
- 【CSS3进阶】酷炫的3D旋转透视
之前学习 react+webpack ,偶然路过 webpack 官网 ,看到顶部的 LOGO ,就很感兴趣. 最近觉得自己 CSS3 过于薄弱,想着深入学习一番,遂以这个 LOGO 为切入口,好好研 ...
- Windows错误码解析
C或者C++开发肯定经常会遇到各种错误码,由于每个错误码只是一个枚举或者一个整形数值,调试或者输出日志的时候,无法知道这个错误码的具体含义,这时候就需要将此错误码解释出来.对于自己定义的错误码,可以通 ...
- 完全使用一组 DSL 来操作 Grid 控件
最近尝试了一下将 XtraGrid 的初始化工作封装成内部 DSL,例如一个普通的基础数据的增删改查操作的代码会像下面这样: public partial class UserForm : XtraF ...