美文网首页
数组 集合 操作

数组 集合 操作

作者: 蚂蚁揍蜗牛 | 来源:发表于2018-08-13 17:31 被阅读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,枚举器的性能相对较差
    

    相关文章

      网友评论

          本文标题:数组 集合 操作

          本文链接:https://www.haomeiwen.com/subject/pouubftx.html