下面详细的介绍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中的集合类的更多相关文章

  1. 理解Objective C 中id

    什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...

  2. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

  3. JUC集合之 JUC中的集合类

    Java集合包 在"Java 集合系列01之 总体框架"中,介绍java集合的架构.主体内容包括Collection集合和Map类:而Collection集合又可以划分为List( ...

  4. objective C中的字符串NSStirng常用操作

    objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...

  5. java中的集合类总结

    在使用Java的时候,我们都会遇到使用集合(Collection)的时候,但是Java API提供了多种集合的实现,我在使用和面试的时候频 频遇到这样的“抉择” . :)(主要还是面试的时候) 久而久 ...

  6. 【转载】C#中ArrayList集合类使用Remove方法指定元素对象

    ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,任何数据类型的变量都可加入到同一个ArrayList集合中,在Array ...

  7. 【转载】C#中ArrayList集合类使用Add方法添加元素

    ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,任何数据类型的变量都可加入到同一个ArrayList集合中,因此使用Ar ...

  8. 【转载】C#中ArrayList集合类使用RemoveAt方法移除指定索引的元素

    ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,任何数据类型的变量都可加入到同一个ArrayList集合中,在Array ...

  9. 【转载】C#中ArrayList集合类和List集合类的比较

    List集合类和ArrayList集合类都是C#语言中用于存储集合数据的集合类,两者都可灵活的插入.删除以及访问元素等等.但List集合和ArrayList集合的差别还是挺大的,首先List集合类是泛 ...

随机推荐

  1. Odoo 二次开发教程(五)-新API的介绍与应用

    [关于odoo新API的介绍,Internet上资料很少,或者不够完整详实,这会对初学者造成很大的困惑,本篇的目的就是希望能帮助新手了解新API的大概] odoo 新api的实现是借助于python装 ...

  2. (转)详解css3弹性盒模型(Flexbox)

    今天刚学了css3的弹性盒模型,这是一个可以让你告别浮动.完美实现垂直水平居中的新特性. Flexbox是布局模块,而不是一个简单的属性,它包含父元素和子元素的属性. Flexbox布局的主体思想是似 ...

  3. System.Dynamic.ExpandoObject 类型的简单使用

    该类型可以实现的是动态添加属性和移除属性,有点类似 js 中对象的操作,非常灵活 static void Main(string[] args) { dynamic obj = new System. ...

  4. 测试EF6.1.3和OrmLite性能

    公司原来用nhibernate,现在考虑要不要换一种ORM,于是找来了EF和ServiceStack.OrmLite.所以就产生了测试这三个性能的要求.对比三个ORM工具的性能,主要是对比ORM配置和 ...

  5. HW2016_字符串_STL_DP

    一.在字符串str1中删除那些在str2中出现的字符. str2可能会有重复字符,直接遍历会导致效率低下,故先借助STL的set容器对str1查重: 然后,遍历str1和str2,对str1进行查重. ...

  6. 四则运算项目git统计

    GitHub统计 1.Git文档目录 图 1文档结构预览 2.Git提交进度图 图 2 9月12日-10月3日 图 3 10月3日-10月14日 图 4 10月14日-10月21日 图 5 10月21 ...

  7. 如何在Windows 2003+IIS6的环境下找回应用程序池(application pool)中的服务账号密码

    上一篇文章说了说如何在Win2008+iis7中取出SharePoint管理账号密码的方法. 整个过程简单的讲,就是通过使用要找回密码的账号用来在SharePoint中创建一个临时的Web Appli ...

  8. linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程

    1. 实验目的 选择一个系统调用(13号系统调用time除外),系统调用列表,使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 分析汇编代码调用系统调用的工作过程,特别是参数的传递的方 ...

  9. 培训SQLServer 嵌套事务PPT分享

    培训SQLServer 嵌套事务PPT分享 下载地址 http://files.cnblogs.com/files/lyhabc/SQLServer%E5%B5%8C%E5%A5%97%E4%BA%8 ...

  10. [.net 面向对象程序设计深入](6).NET MVC 6 —— 模型、视图、控制器、路由等的基本操作

    [.net 面向对象程序设计深入](6).NET MVC 6 —— 模型.视图.控制器.路由等的基本操作 1. 使用Visual Studio 2015创建Web App (1)文件>新建> ...