下面详细的介绍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. problem-eclipse创建maven项目报错

    Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:2.5 or one of ...

  2. redis 下载及使用

    redis 官网下载地址:http://redis.io/ E:\工作软件\新建文件夹\redis64-2.8.19  redis-server.exe 执行该命令 当前已启动  端口号:6379 r ...

  3. 一个flex buider 3 在eclipse下不能编译的问题解决

    今天处理一个遗留的项目:项目使用了flex作为界面,装好flex Builder 3 并添加插件到eclipse,eclipse使用3.7版本. 导入项目,编译,发现编译时候出现 Errors run ...

  4. Webform Application传值 ViewState

    Application:所有的会话共享一个Application空间,任何一个人改变Application的内容,其他人都会发现被改变了.Application中的内容不会被自动释放 存放位置:服务端 ...

  5. cordova插件开发注意事项

    1. 编写插件,先创建好cordova项目之后,在项目里开发调试好在去创建插件目录 如何在cordova项目里创建呢,在android文件夹下面的res/xml/config.xml里去加入插件 例如 ...

  6. EXT 下拉框事件

    1. <ext:ComboBox ID="cbline" FieldLabel="平台部门来源" runat="server" Dis ...

  7. POJ2369 Permutations(置换的周期)

    链接:http://poj.org/problem?id=2369 Permutations Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  8. SQL Server 数据变更时间戳(timestamp)在复制中的运用

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 方案(Solution) 方案一(Solution One) 方案二(Solution Two ...

  9. Visual Studio 2015 前端开发工作流

    Visual Studio 2015 CTP 5,全称为 Visual Studio 2015 Community Technology Preview 5,意为社区技术预览版,之前的版本为:Visu ...

  10. ASP.NET Core 1.0中的管道-中间件模式

    ASP.NET Core 1.0借鉴了Katana项目的管道设计(Pipeline).日志记录.用户认证.MVC等模块都以中间件(Middleware)的方式注册在管道中.显而易见这样的设计非常松耦合 ...