1、求数组的 交集,并集,差集
NSArray *array1 = @[@"1",@"2",@"3"];
NSArray *array2 = @[@"1",@"5",@"6"];
NSMutableSet *set1 = [NSMutableSet setWithArray:array1];
NSMutableSet *set2 = [NSMutableSet setWithArray:array2];
[set1 unionSet:set2]; //取并集后 set1中为1,2,3,5,6
[set1 intersectSet:set2]; //取交集后 set1中为1
[set1 minusSet:set2]; //取差集后 set1中为2,3,5,6
备注:利用了集合的api进行数组的验证
2、判断一个数组是否为另一个数组的子集
NSArray *array3 = @[@"1",@"2"];
NSArray *array4 = @[@"1",@"2",@"6"];
NSSet *set3 = [NSSet setWithArray:array3];
NSSet *set4 = [NSSet setWithArray:array4];
BOOL isSub = [set3 isSubsetOfSet:set4]; //isSub为YES
3、判断某个对象是否在某个数组中
BOOL isExist = [array3 containsObject:@"1"]; //isExist为YES
4、数组倒叙的方法
NSArray *array = @[@"name", @"w", @"aa", @"ZXPing"];
[array reverseObjectEnumerator]
5.数组遍历方法选择
1、for 循环
可以正序、逆序查询数据。也常用于创建九宫格。
2、for in 循环
forin 遍历 又称快速遍历,与for循环最明显的区别就是看不到循环次数及索引情况。
数组是有序的 for循环过程中也是有序的,forin遍历过程中是根据数组中数据添加顺序而定的。
3、枚举器
枚举器是一种苹果官方推荐的更加面向对象的一种遍历方式,
相比于for循环,它具有高度解耦、面向对象、使用方便等优势
//正序遍历数组
[self.traverseArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"正序%@",obj);
}]
//逆序遍历数组
[self.traverseArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"逆序%@",obj);
}]
//遍历字典
#warning 字典是无序的不存在正序逆序
[self.traverseDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
NSLog(@"key:%@->value%@",key,value)
}]
注意:当需要结束循环的时候,调用stop,赋予YES 则结束循环,如:*stop = YES;
此方法方法的优点:
1.遍历顺序有正序/倒序/并发混序三种, 可根据枚举值控制比 for循环方便许多.
2.遍历中自带 *stop参数, 跳出方便.
3.可以在遍历的 block中增删数据, 比 forin遍历方便许多
4.dispatch_apply函数
GCD dispatch_apply函数是一个同步调用,block任务执行n次后才返回。
该函数比较适合处理耗时较长、迭代次数较多的情况。
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_apply(array.count, queue, ^(size_t insex) {
NSLog(@" dispatch_apply %@",array[insex]);
});
备注:性能比较
循环100次 : 枚举器=0.0294s > dispatch_apply=030285s > for =0.0281s > for in=0.0271s
循环10000次:for in=2.8060s >枚举器=2.7792s > for =2.7147s > dispatch_apply=2.5359s
循环100000次:枚举器=31.9950s > for in=28.0213s > for =27.2070s > dispatch_apply=25.3876s
所以当 循环次数不高时,三种相差不大,但是当处理比较耗时且循环次数相对较多时,使用异步的dispatch_apply,枚举器的性能相对较差
网友评论