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] < 0)
        {
            NSLog(@"交换");
            return 1;
        }
        else
        {
            NSLog(@"不交换");
            return -1;
        }
    }];

   二、字典(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;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iOS技术杂谈

iOS block探究(一): 基础详解你要知道的block都在这里

你要知道的block都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本文大纲 blo...

3338
来自专栏数据结构与算法

codevs4919 线段树练习4

 时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果 题目描述 Description 给你N个数,有两...

2815
来自专栏赵俊的Java专栏

合并区间

2063
来自专栏函数式编程语言及工具

Scalaz(27)- Inference & Unapply :类型的推导和匹配

 经过一段时间的摸索,用scala进行函数式编程的过程对我来说就好像是想着法儿如何将函数的款式对齐以及如何正确地匹配类型,真正是一种全新的体验,但好像有点太偏...

2128
来自专栏青玉伏案

Objective-C中的继承和多态

   面向对象编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的OOP语言之间都有其特点。OC中和Java类...

2158
来自专栏iOS技术杂谈

iOS @property探究(二): 深入理解你要知道的@property都在这里

你要知道的@property都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 上一篇文...

3547
来自专栏ios 技术积累

Objective-C 数组对象排序

NSSortDescriptor可以根据数组中对象的属性来排序 为排序数组的每个属性创建NSSortDescriptor对象,将所有这些对象放入一个数组中,该...

1714
来自专栏iOS 开发杂谈

iOS 泛型 ObjectType 协变 __covariant 逆变 __contravariant

__covariant(协变):用于泛型数据强转类型,可以向上强转,子类可以转成父类。 __contravariant(逆变):用于泛型数据强转类型,可以向下...

3623
来自专栏wOw的Android小站

[Objective-C] id类型和instancetype类型

id数据类型可以存储任何类型的对象。可以说,它是一般对象类型。 例如可以声明一个为id类型的变量:

1001
来自专栏数据结构与算法

4927 线段树练习5

时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果 题目描述 Description 有n个数和5种操作...

36814

扫码关注云+社区

领取腾讯云代金券