Объединение NSArrays через пересечение и союз - PullRequest
15 голосов
/ 01 октября 2011

У меня есть два NSArrays A и B, которые совместно используют некоторые общие элементы, например,

A: 1,2,3,4,5 
B: 4,5,6,7

Я хотел бы создать новый NSArray, состоящий из содержимого, общего между двумя NSArrays, объединенного с содержимым второгоNSArray, сохраняя порядок элементов и удаляя дубликаты.То есть я хотел бы (A ∩ B) ∪ B.

Операция на предыдущих массивах NSArrays даст:

A ∩ B: 4,5
(A ∩ B) ∪ B: 4,5,6,7

Как мне выполнить это в Objective-C?

Ответы [ 5 ]

22 голосов
/ 01 октября 2011

Преобразование NSArray с в NSSet с, доступны стандартные операции набора.

NSArray *a = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", nil];
NSArray *b = [NSArray arrayWithObjects:@"4", @"5", @"6", @"7", nil];

NSMutableSet *setA = [NSMutableSet setWithArray:a];
NSSet *setB = [NSSet setWithArray:b];
[setA intersectSet:setB];
NSLog(@"c: %@", [setA allObjects]);

Вывод NSLog: c: (4, 5)

[setA unionSet:setB];
NSLog(@"d: %@", [setA allObjects]);

Вывод NSLog: d: (6, 4, 7, 5)

15 голосов
/ 01 октября 2011

Как уже предлагали другие, вы можете легко сделать это с помощью NSSet.Однако это не сохранит порядок.

Если вы хотите сохранить порядок и можете настроить OS X 10.7+, то вы можете использовать новый NSOrderedSet (и изменяемый подкласс) длясделать то же самое.

6 голосов
/ 01 октября 2011

Используя NSSet, как уже отмечали другие. Для

NSArray * a = [NSArray arrayWithObjects: ... ];
NSArray * b = [NSArray arratWithObjects: ... ];
NSMutableSet * set = [NSMutableSet setWithArray:a];
[set intersectSet:[NSSet setWithArray:b];
[set unionSet:[NSSet setWithArray:b];

Это заботится о обманщиках, но не сохраняет порядок. Вы бы взяли результаты в «set» и отсортировали их обратно в массив. Нет встроенной функциональности коллекции, которая бы все это делала - если вы предпочитаете сохранять порядок и беспокоиться о дублировании отдельно, используйте метод NSMutableArray -removeObjectsInArray: и т. Д.

2 голосов
/ 14 августа 2015

(A ∩ B) ∪ B всегда будет давать вам B, так что это довольно странная вещь, которую нужно вычислить. Это все равно что сказать: «Дайте мне набор всех автомобилей, окрашенных в зеленый цвет, в сочетании с набором всех автомобилей». Это даст вам набор всех автомобилей.

0 голосов
/ 01 октября 2011

Существует класс NSSet, который можно использовать для выполнения этих операций.

...