通过交叉和联合组合NSArrays

时间:2011-09-30 21:53:11

标签: objective-c nsarray union set-theory

我有两个共享一些共同元素的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中完成此操作?

5 个答案:

答案 0 :(得分:22)

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)

答案 1 :(得分:15)

正如其他人所建议的那样,您可以使用NSSet轻松完成此操作。但是,这不会保留订购。

如果你想保留排序并且可以定位OS X 10.7+,那么你可以使用新的NSOrderedSet(和可变子类)来做同样的事情。

答案 2 :(得分:6)

正如其他人所指出的那样,使用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:方法等。

答案 3 :(得分:2)

(A∩B)∪B总会给你B,所以这是一个非常奇怪的想要计算的东西。它就像在说#34;给我一套绿色的车,再加上所有车的组合"。那会给你所有车的一套。

答案 4 :(得分:0)

您可以使用NSSet类来执行这些操作。