2010-02-16 2 views
1

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

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

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

Каков наилучший способ для этого?

ответ

10

Вы уверены, что вам нужно NSArray? Для пересечений было бы лучше использовать NSSet с. Для получения дополнительной информации об использовании NSArrays и NSSet обратитесь к Cocoa with Love: NSArray or NSSet, NSDictionary or 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:, однако я никогда УНР ked с NSPredicate s, поэтому это только предположение.

+0

Это хорошее предложение, с оговоркой, что для NSSet, каждый объект в каждом наборе должен быть уникальным. Если ваши массивы имеют повторяющиеся значения, например. [0,1,2,3,2,4], NSSet не будет работать. – TechZen

+0

Напротив, NSSet весьма полезен, потому что он не добавляет дубликатов (когда вы добавляете к нему массив). Спасибо за помощь ComSubVie и MrMage. Теперь все работает. –

+0

Это зависит от вашего проблемного пространства. Если вы хотите записать, сколько дубликатов существует, даже если они являются дубликатами одного и того же объекта/элемента, то NSSet не будет работать. – TechZen

5

Самый простой (но не обязательно самый быстрый (?)) Кстати было бы что-то вроде

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

Вам придется сортировать результирующий массив снова, однако.

Смежные вопросы