我有三个NSMutableArray,包含根据不同标准添加到列表中的名称。
这是我的数组伪代码:
NSMutableArray *array1 = [@"Jack", @"John", @"Daniel", @"Lisa"];
NSMutableArray *array2 = [@"Jack", @"Bryan", @"Barney", @"Lisa",@"Penelope",@"Angelica"];
NSMutableArray *array3 = [@"Jack", @"Jerome", @"Dan", @"Lindsay", @"Lisa"];
我想找到第四个数组,其中包括这三个数组的交集。在这种情况下,例如它将是:
NSMutableArray *array4 = [@"Jack",@"Lisa"];
因为所有三个阵列都有jack和lisa作为元素。有没有办法简单地这样做?
答案 0 :(得分:74)
使用NSMutableSet
:
NSMutableSet *intersection = [NSMutableSet setWithArray:array1];
[intersection intersectSet:[NSSet setWithArray:array2]];
[intersection intersectSet:[NSSet setWithArray:array3]];
NSArray *array4 = [intersection allObjects];
唯一的问题是你丢失了元素的排序,但我认为(在这种情况下)那没关系。
正如评论中指出的那样(感谢,Q80!),iOS 5和OS X 10.7添加了一个名为NSOrderedSet
的新类(带有Mutable
子类),允许你在保持秩序的同时执行这些相同的交叉操作。
答案 1 :(得分:2)
查看this post。
简而言之:如果你可以使用NSSet而不是NSArray,那么它很简单(NSMutableSet有intersectSet:
)。
否则,您可以从NSArray构建NSSet并返回上述情况。
答案 2 :(得分:1)
NSMutableArray *first = [[NSMutableArray alloc] initWithObjects:@"Jack", @"John", @"Daniel", @"Lisa",nil];
NSMutableArray *seconds =[[NSMutableArray alloc] initWithObjects:@"Jack", @"Bryan", @"Barney", @"Lisa",@"Penelope",@"Angelica",nil];
NSMutableArray *third = [ [ NSMutableArray alloc]init];
for (id obj in first) {
if ([seconds containsObject:obj] ) {
[third addObject:obj];
}
}
NSLog(@"third is : %@ \n\n",third);
<强>输出:强>
第三是:(Jack,
Lisa
)
答案 3 :(得分:1)
这比NSSet
方法更清晰,你不会失去原来的顺序。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self IN %@ AND self IN %@", array2, array3];
NSArray *array4 = [array1 filteredArrayUsingPredicate:predicate];
答案 4 :(得分:-1)
以上是
链接的工作变体NSPredicate *intersectPredicate = [NSPredicate predicateWithFormat:@"SELF IN %@", @[@500, @400, @600]];
NSArray *intersect = [@[@200, @300, @400] filteredArrayUsingPredicate:intersectPredicate];