条件:对两个数组已经排好序
一:
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的范围内,再进行最后的遍历操作,也算是一个优化。
网友评论