参考博客: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;