查找NSMutableArray的交集

时间:2011-05-16 21:16:18

标签: iphone nsmutablearray intersection

我有三个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作为元素。有没有办法简单地这样做?

5 个答案:

答案 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];