数组 集合 操作

2018-08-13  本文已影响0人  蚂蚁揍蜗牛

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,枚举器的性能相对较差
上一篇下一篇

猜你喜欢

热点阅读