我有两个NSArray,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中实现这个?
我有两个NSArray,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中实现这个?
将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)
如其他人所建议,您可以轻松地使用NSSet
来实现,但这样做将不会保留顺序。
如果您想要保留顺序并且目标系统是OS X 10.7+,那么您可以使用新的NSOrderedSet
(以及可变的子类)来完成同样的事情。
NSSet
方法,但是需要手动从 B
中提取最终集合中的元素。你需要自己保留顺序。 - Dave DeLongNSArray * a = [NSArray arrayWithObjects: ... ];
NSArray * b = [NSArray arratWithObjects: ... ];
NSMutableSet * set = [NSMutableSet setWithArray:a];
[set intersectSet:[NSSet setWithArray:b];
[set unionSet:[NSSet setWithArray:b];
-removeObjectsInArray:
方法等。(A ∩ B) ∪ B总是返回B,所以计算这个是一件很奇怪的事情。这就像说“给我所有绿色车辆的集合,再加上所有车辆的集合”。这将会给你所有车辆的集合。
你可以使用 NSSet
类来执行这些操作。