Подтвердить что ты не робот

Объединение NS-массивов через пересечение и объединение

У меня есть два 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?

4b9b3361

Ответ 1

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

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)

Ответ 2

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

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

Ответ 3

Используя 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: и т.д.

Ответ 4

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

Ответ 5

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