NSArray - проверить, находятся ли объекты в массиве?

У меня есть 2 массива. Один представляет собой большую статическую группу из 600 объектов, другой — небольшую переменную группу из 10 объектов.

Я хочу взять любые общие объекты между двумя группами и поместить их в новый массив.

Допустим, большая группа содержит 600 объектов с именами от 1 до 600. Меньшая группа содержит 9 объектов: 1, 2, 3, 4, 5, 6, а, б, в. Я хочу иметь возможность создать новый массив, содержащий объекты 1, 2, 3, 4, 5, 6.

Как лучше всего это сделать?


person Zac Altman    schedule 16.02.2010    source источник


Ответы (2)


Вы уверены, что вам нужны NSArrays? Для пересечений лучше использовать NSSets. Дополнительные сведения об использовании NSArrays и NSSet см. в Какао с Любовь: NSArray или NSSet, NSDictionary или NSMapTable.

Если вы используете NSSet, вам нужно создать новый NSMutableSet, у которого есть метод intersectSet:, который можно использовать для ваших целей:

NSMutableSet *set1 = [[NSMutableSet alloc] initWithObjects:@"0", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", nil];
NSMutableSet *set2 = [[NSMutableSet alloc] initWithObjects:@"2", @"4", @"6", @"8", @"10", @"12", @"14", @"18", nil];

NSLog(@"set1: %@", set1);
NSLog(@"set2: %@", set2);
[set1 intersectSet:set2];
NSLog(@"isec: %@", set1);

Вы можете создать NSMutableSet из NSArray, используя метод addObjectsFromArray::

NSArray *array = [[NSArray alloc] initWithObjects:@"1", @"2", nil];
NSMutableSet *set = [[NSMutableSet alloc] init];
[set addObjectsFromArray:array];

Возможно, вы также можете отфильтровать NSArray с помощью метода filterUsingPredicate:, однако я никогда не работал с NSPredicates, поэтому это только предположение.

person ComSubVie    schedule 16.02.2010
comment
Это хорошее предложение с оговоркой, что для NSSet каждый объект в каждом наборе должен быть уникальным. Если ваши массивы имеют повторяющиеся значения, например. [0,1,2,3,2,4], NSSet работать не будет. - person TechZen; 16.02.2010
comment
Напротив, NSSet весьма полезен, потому что он не добавляет дубликатов (когда вы добавляете к нему массив). Спасибо за помощь ComSubVie и MrMage. Теперь все работает. - person Zac Altman; 16.02.2010
comment
Это зависит от вашего проблемного пространства. Если вы хотите записать, сколько существует дубликатов, даже если они являются дубликатами одного и того же объекта/элемента, то NSSet не будет работать. - person TechZen; 16.02.2010
comment
В противном случае вы все равно можете использовать NSCountedSet. - person MrMage; 16.02.2010

Самый простой (но не обязательно самый быстрый (?)) способ будет выглядеть примерно так:

NSMutableSet *intersection = [NSMutableSet setWithArray:smallArray];
[intersection intersectSet:[NSSet setWithArray:bigArray];
NSArray *result = [NSArray arrayWithSet:intersection];

Однако вам придется снова отсортировать полученный массив.

person MrMage    schedule 16.02.2010