- OC中的集合类
- 数组NSArray
- 可变数组NSMutableArray
- 字典NSDictionary
- 可变字典NSMutableDictionary
- 集NSSet
OC的集合类
OC语言的集合不再是单纯的数组,而是分为3大类:数组NSArray,字典NSDictionary,集NSSet;平常使用的集合都是这3类,或者他们的子类;
OC语言的所有集合都是对象;
集合中的元素也都是对象,集合中也只能存放对象;
简单及复杂数据类型(int、double、CGPoint、CGRect)可以封装为NSValue、NSNumber对象再放入集合类中;
集合中不能存放nil空对象,nil是作为集合结束标识符;
OC集合没有多维的概念,也就是不会出现根本意义上的二维数组,我们可以简单的这样理解:在数组中存放了一个对象,这个对象是数组;
集合的所有运算依赖于方法,但是多数情况下依旧要使用循环。
数组
OC中的集合类只能收集cocoa对象(NSObject对象),C数据类型(例如:int、float、double、BOOL等),需要封装成NSNumber类型的,才可以保存在集合类中。(NSNumber对象是cocoa对象)
OC中的数组同C语言中的数组非常接近,常见的用法首先是创建数组,然后对数组进行操作。OC中数组分为不可变数组(NSArray)和可变数组(NSMutableArray) ,且只能存储Object-C对象。
NSArray在初始化的同时一般需要指定它所包含的元素,以nil作为结束标志,初始化中不能包含空对象;
NSArray是不可变数组,数组存放的对象个数和每个对象都不可改。
OC数组:
1.可变数组(NSMutableArray),不可变数组(NSArray)
2.数组的元素只能是对象类型
3.nil作为一个结束标示
4.下标从0开始
5.数组元素不一定是一个类型,NSString,NSNumber...
1.实例方法初始化
NSArray *array1 = [[NSArray alloc] initWithObjects:@"2",@"3",@5, nil];
NSArray *array2 = [[NSArray alloc] initWithArray:array1];
NSLog(@"array1 = %@,array2 = %@",array1,array2);
2.便利初始化方法
NSArray *array3 = [NSArray arrayWithObjects:@"5",@7,@"abc", nil];
NSLog(@"array3 = %@",array3);
NSArray *array4 = [NSArray arrayWithArray:array3];
3.简化操作
注意:
简化适合不可变数组,不推荐可变数组使用。 想得到可变版本的话,可以对其发送-mutableCopy消息以生成一份可变的拷贝。
示例:NSMutableArray *array = [@[@”hello”,@”rimi”] mutableCopy];
另外,对于标记为static的数组,不能使用简写为其赋值。
NSArray *array5 = @[@"1",@"2",@"3"];
NSLog(@"array5 = %@",array5);
4.获取数组元素个数
NSInteger count = array5.count;
NSInteger count1 = [array5 count];
NSLog(@"%ld",count);
数组的运算:
1.添加元素
NSArray *array1 = @[@"1",@"2",@"3"];
NSArray *addArray = [array1 arrayByAddingObject:@"4"];
NSLog(@"addArray = %@",addArray);
NSArray *addArray2 = [array1 arrayByAddingObjectsFromArray:array1];
NSLog(@"addArray2 = %@",addArray2);
2.查找元素
NSArray *array1 = @[@"1",@"2",@"3"];
NSInteger index = [array1 indexOfObject:@"3"];
NSLog(@"index = %ld",index);
3.获取元素
NSString *string1 = array1[2];
NSLog(@"string1 = %@",string1);
NSString *string2 = [array1 objectAtIndex:0];
NSLog(@"string2 = %@",string2);
//获取第一个
NSLog(@"%@",[array1 firstObject]);
//获取最后一个
NSLog(@"%@",[array1 lastObject]);
//获取部分元素
NSArray *subArray = [array1 subarrayWithRange:NSMakeRange(0, 2)];
NSLog(@"subArray = %@",subArray);
4.数组的排序
NSArray *sortArray = [NSArray arrayWithObjects:@"1",@"7",@"4", nil];
NSArray *sortArray = @[@"3",@"7",@"5",@"33"];
//@selector方法选择器
NSArray *newSortArray = [sortArray sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"sortArray = %@",newSortArray);
/*
NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending
*/
NSArray *newSor = [sortArray sortedArrayUsingComparator:^NSComparisonResult(id __nonnull obj1, id __nonnull obj2) {
NSInteger a = [obj1 integerValue];
NSInteger b = [obj2 integerValue];
if (a == b) {
return 0;
}else if (a > b){
return NSOrderedAscending;
}else{
return 1;
}
}];
NSLog(@"newsort = %@",newSor);
数组的遍历
NSArray *sortArray = @[@"3",@"7",@"5",@"33"];
//for循环
for (int i = 0; i < sortArray.count ; i ++) {
NSLog(@"sort = %@",[sortArray objectAtIndex:i]);
}
//快速枚举
for (id object in sortArray) {
NSLog(@"object = %@",object);
}
//如果遍历的数组是可变类型,一定不要在循环体中进行添加或移除操作,一般先记录对象,循环结束后再整体添加或删除。
NSMutableArray
可变数组NSMutableArray,继承自NSArray,拥有父类的。
NSMutableArray的方法,直接对数组自身进行操作,没有返回值。
//初始化
NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithObjects:@"3",@5,@"7", nil];
NSMutableArray *mutableArr2 = [NSMutableArray arrayWithObjects:@"4",@"5", nil];
NSMutableArray *mutableArr3 = [NSMutableArray arrayWithCapacity:20];
//增
[mutableArr2 addObject:@"8"];
NSLog(@"mutable2 = %@",mutableArr2);
//删
[mutableArr2 removeObject:@"8"];
//查
NSInteger index1 = [mutableArr2 indexOfObject:@"4"];
NSLog(@"index = %ld",index1);
//改(替换)
[mutableArr2 replaceObjectAtIndex:0 withObject:@"7"];
NSLog(@"mutable2 = %@",mutableArr2);
//排序
[mutableArr2 sortUsingSelector:@selector(compare:)];
NSLog(@"sort = %@",mutableArr2);