美文网首页
iOS求两个数组里的相同元素

iOS求两个数组里的相同元素

作者: _清墨 | 来源:发表于2019-04-16 10:28 被阅读0次

    条件:对两个数组已经排好序

    一:
        NSArray *A = @[@1,@2,@3,@4,@5,@6,@7,@8,@9,@13];
        NSArray *B = @[@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12];
    
        NSMutableArray *newA = [[NSMutableArray alloc]initWithArray:A];
    
        NSInteger minB = [B[0] integerValue];  //取出B数组中最小的值
        for (int i=0; i<A.count; i++) {
            NSInteger minA = [A[i] integerValue];
            if (minA<minB) {
                [newA removeObjectAtIndex:i];
            }else{
                break;
            }
        }
    
        NSMutableArray *realA = [[NSMutableArray alloc]initWithArray:newA]; //这里注意要重新构建一个新数组,表示最终的在范围内的数组.
        NSInteger maxB = [B[B.count-1] integerValue]; //取出B数组中最大的值
        for (int i=newA.count-1; i>0; i--) {
            NSInteger maxA = [newA[i] integerValue];
            if (maxA>maxB) {
                [realA removeObjectAtIndex:i];
            }else{
                break;
            }
        }
    
        NSLog(@"%@",realA);
    
    
        for (int i=0; i<realA.count; i++) {
            NSNumber *valueA = realA[i];
            if ([B containsObject:valueA]) {
                NSLog(@"%@是在B数组里",valueA);
            }
    
        }
    

    结果:

    2019-04-16 10:09:57.922207+0800 SYAnswer[68108:3274705] (
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
    )
    2019-04-16 10:09:57.922409+0800 SYAnswer[68108:3274705] 1是在B数组里
    2019-04-16 10:09:57.922514+0800 SYAnswer[68108:3274705] 2是在B数组里
    2019-04-16 10:09:57.922612+0800 SYAnswer[68108:3274705] 3是在B数组里
    2019-04-16 10:09:57.922711+0800 SYAnswer[68108:3274705] 4是在B数组里
    2019-04-16 10:09:57.922810+0800 SYAnswer[68108:3274705] 5是在B数组里
    2019-04-16 10:09:57.922900+0800 SYAnswer[68108:3274705] 6是在B数组里
    2019-04-16 10:09:57.922989+0800 SYAnswer[68108:3274705] 7是在B数组里
    2019-04-16 10:09:57.923080+0800 SYAnswer[68108:3274705] 8是在B数组里
    2019-04-16 10:09:57.923171+0800 SYAnswer[68108:3274705] 9是在B数组里
    

    这个比起直接遍历做得优一点的地方在于先把A数组中元素剔除出来(范围在B内),然后再进行遍历,这也得益于数组已经排好序。

    二.
        NSArray *array1 = @[@1,@2,@3,@4,@5,@6,@7,@8,@9,@13];
        NSArray *array2 = @[@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12];
        
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        
        for (int i=0; i<array2.count; i++) {
            [dict setObject:array2[i] forKey:array2[i]];
        }
        
        for (int i=0; i<array1.count; i++) {
            NSNumber *value = [dict objectForKey:array1[i]];
            if (value) {
                NSLog(@"数组array1中%@在数组array2中",value);
            }
        }
    

    结果:

    2019-04-16 10:20:31.367393+0800 SYAnswer[68281:3279609] 数组array1中1在数组array2中
    2019-04-16 10:20:31.367543+0800 SYAnswer[68281:3279609] 数组array1中2在数组array2中
    2019-04-16 10:20:31.367638+0800 SYAnswer[68281:3279609] 数组array1中3在数组array2中
    2019-04-16 10:20:31.367724+0800 SYAnswer[68281:3279609] 数组array1中4在数组array2中
    2019-04-16 10:20:31.367813+0800 SYAnswer[68281:3279609] 数组array1中5在数组array2中
    2019-04-16 10:20:31.367905+0800 SYAnswer[68281:3279609] 数组array1中6在数组array2中
    2019-04-16 10:20:31.367998+0800 SYAnswer[68281:3279609] 数组array1中7在数组array2中
    2019-04-16 10:20:31.368087+0800 SYAnswer[68281:3279609] 数组array1中8在数组array2中
    2019-04-16 10:20:31.368176+0800 SYAnswer[68281:3279609] 数组array1中9在数组array2中
    

    这种是以字典的形式来做的,效率相比第一种会更好一些。
    我们这里有条件:数组是排过序的,这样也是可以借助第一种方案,先把array1内值筛选到array2的范围内,再进行最后的遍历操作,也算是一个优化。

    相关文章

      网友评论

          本文标题:iOS求两个数组里的相同元素

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