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