OC中的集合

参考博客:http://blog.csdn.net/hierarch_lee/article/details/49834151

简介

在Objective-C中的集合类中主要包括不可变的数组–NSArray, 可变的数组–NSMutableArray, 不可变的字典–NSDictionary, 可变的字典–NSMutableDictionary, 不可变的集合–NSSet,可变的集合–NSMutableSet。


数组

  • OC中的集合类只能收集cocoa对象(NSObject对象),C数据类型(例如:int、float、double、BOOL等),需要封装成NSNumber类型的,才可以保存在集合类中。(NSNumber对象是cocoa对象)。

  • OC中的数组同C语言中的数组非常接近,常见的用法首先是创建数组,然后对数组进行操作。

  • OC中数组分为不可变数组(NSArray)和可变数组(NSMutableArray) ,且只能存储Object-C对象。

  • NSArray在初始化的同时一般需要指定它所包含的元素,以nil作为结束标志,初始化中不能包含空对象。

  • NSArray是不可变数组,数组存放的对象个数和每个对象都不可改。

不可变的数组 NSArray

数组是有序对象的集合,用来存储对象的有序列表,在OC中数组中必须存的是对象,不能是基本数据类型,若想存入基本数据类型,必须先把数据类型转换成对象,然后再存入集合类中。

//(1)NSArray的初始化

NSArray的便利初始化函数: -(id) initWithObjects : (id) firstObject, ….;

NSArray的便利构造器: +(id) arrayWithObjects: (id) firstObject, …;
//简化操作
1、[NSArray array]  简写为 @[]
NSArray *array = @[];

2、[NSArray arrayWithObject:a]  简写为 @[ a ]
NSArray *array = @[@"Hello"];

3、[NSArray arrayWithObjects:a,b,c]  简写为 @[ a,b,c ]
NSArray *array = @[@"a", @"b", @"c"];

可变数组:NSMutableArray

NSArray的容量是固定的,而NSMutableArray的容量是可变的,我们可以在NSMutableArray实例化的时候先初始化一个容量,不过这个容量不是固定的,不够的时候会自动增加。NSMutableArray是NSArray的子类,是对NSArray的一个扩充。

(1) NSMutableArray的初始化

//(1) NSMutableArray的初始化

NSMutableArray的便利初始化函数:-(id) initWithCapacity : (NSUInteger) numItems;

NSMutableArray的便利构造器:+(id) arrayWithCapacity: (NSUInteger) numItems;

(2)元素的添加和删除

增加元素: -(void) addObject: (id) anObject; –往数组的尾部添加元素

删除全部内容: -(void) removeAllObjects;

删除最后一个元素: -(void) removeLastObject;

通过索引删除元素: -(void) removeObjectAtIndex: (NSUInteger) index;

删除任意一个元素: -(void) removeObject : (id)object;

(3)遍历

for (int i = 0; i < [array count]; i++) {
    // 依次取出数组每个元素
    id obj = [array objectAtIndex:i];
}


for (id obj in array) {
    // obj do something
}

//迭代遍历数组
//获取枚举器
NSEnumerator *enumerator = [array objectEnumerator];
//临时变量
id obj;
while (obj = [enumerator nextObject]) {
    NSLog(@"%@", obj);
}

字典

  • 字典就是关键字及其定义(描述)的集合。Cocoa中的实现字典的集合NSDictionary在给定的关键字(通常是一个NSString)下存储一个数值(可以是任何类型的对象)。即:存储方式为通过 键-值 对的方式来存放数据的一种无序集合。

  • 字典也被称为散列表或关联数组。

  • 不同于数组,字典使用的是键查询的优化存储方式。它可以立即找出要查询的数据,而不需要遍历整个数组进行查找。

  • 一般通过key来操作object。某种意义上,对字典的运算实际上就是对key值的运算。

  • 字典分为不可变字典NSDictionary和可变字典NSMutableDictionary。

不可变字典 NSDictionary

//不可变字典的初始化
NSDictionary *dictionay = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
id value = [dictionay objectForKey:@"key1"];
NSLog(@"key1 => %@", value);

字典的遍历

字典的遍历方法是通过字典里的-(NSArray *)allKeys获取所有的key存入数组中然后通过遍历数组获取key对应的value,封装成函数如下:

//封装遍历字典的函数
void dictionary_display(id dictionay)
{
    NSArray *keys = [dictionay allKeys];
    for (id obj in keys) {
        NSLog(@"%@ => %@", obj, [dictionay objectForKey:obj]);
    }
}
1、[NSDictionary dictionary] 简写为@{}
NSDictionary *dictionary = @{};

2、[NSDictionary dictionaryWithObject:forKey:]  简写为:@{key:value}
NSDictionary *dictionary = @{@"name": @"Admin”};

3、[NSDictionary dictionaryWithObjectsAndKeys:ob1,key1,ob2,key2}  简写为:@{key1:ob1 , key2:ob2};
NSDictionary *dictionary = @{@"one": @"rice",@"two":@"sleep"};

可变字典NSMutableDictionary

在使用可变字典NSMutableDictionary时可以先给可变字典初始化一个空间,如果不够的话会自动增加

给可变字典分配初始化空间: +(id) dictionaryWithCapacity : (NSUInteger) num;

给可变字典添加对象:-(void) setObject(id) obj forKey(id) aKey;

根据关键字删除对象:-(void) removeObjectForKey : (id) aKey;

删除字典中的所有数据: -(void) removeAllObjects;

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);

  • NSSet对象中不能存放重复对象,如果出现重复,最终只会保留一个,NSSet也常用来清除其他集合中的重复对象。

  • 集,类似数组,但区别于数组,其特点是:无序不重复;

  • 集分为可变集 NSSet 与不可变集 NSMutableSet;

不可变集 NSSet

初始化

// 1、alloc + init
- (instancetype)initWithObjects:(ObjectType)firstObj, ... ;

// 2、遍历构造
+ (instancetype)setWithObjects:(ObjectType)firstObj, ...;
1、获取元素个数
- (NSUInteger)count;

2、获取任意元素
- (nullable ObjectType)anyObject;

3、获取所有元素
@property (readonly, copy) NSArray<ObjectType> *allObjects;

4、查询是否包含某一元素
- (BOOL)containsObject:(ObjectType)anObject;
//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中");
}

可变Set NSMutableSet

​ ​ ​1.可变集合的实例化和初始化

​ ​ ​ ​便利初始化函数: -(id) initWithCapacity :(NSUInteger) numItems;

​ ​ ​ ​便利构造器:+(id) setWithCapacity: (NSUInteger) numItems;

​ ​ ​2.往可变集合中添加元素

​ ​ ​ ​-(void) addObject : (id) object;

​ ​ ​3.删除集合中的对象

​ ​ ​ ​-(void) removeAllObjects; 删除所有的对象;

​ ​ ​ ​-(void) removeObjects: (id) object 删除其中某一个对象;

demo:

//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);

把基本数据类型包装成对象

​ ​前面不止一次的提到在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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值