Нахождение пересечения NSMutableArrays - PullRequest
40 голосов
/ 17 мая 2011

У меня есть три 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 ]

74 голосов
/ 17 мая 2011

Использование 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), который позволяет вам выполнить те же самые операции пересечения, сохраняя при этом порядок.

2 голосов
/ 17 мая 2011

Посмотрите на этот пост .

Короче: если вы можете использовать NSSet вместо NSArray, то это тривиально (NSMutableSet имеет intersectSet:).

В противном случае вы можете создать NSSet из NSArray и вернуться к описанному выше случаю.

1 голос
/ 10 октября 2016

Это чище, чем подход NSSet, и вы не потеряете исходный порядок.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self IN %@ AND self IN %@", array2, array3];
NSArray *array4 = [array1 filteredArrayUsingPredicate:predicate];
1 голос
/ 29 августа 2011
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

)

0 голосов
/ 17 октября 2014

Вот рабочий вариант по ссылкам выше

NSPredicate *intersectPredicate = [NSPredicate predicateWithFormat:@"SELF IN %@", @[@500, @400, @600]];
NSArray *intersect = [@[@200, @300, @400] filteredArrayUsingPredicate:intersectPredicate];
...