Objective c 通过相交和并集合并NSArrays

Objective c 通过相交和并集合并NSArrays,objective-c,nsarray,union,set-theory,Objective C,Nsarray,Union,Set Theory,我有两个NSArray A和B,它们共享一些共同元素,例如 A: 1,2,3,4,5 B: 4,5,6,7 我想创建一个新的NSArray,它包含两个NSArray之间的公共内容,并与第二个NSArray的内容连接在一起,同时保持元素的顺序并删除重复项。也就是说,我想∩ (B)∪ B 在以前的NSArray上的操作将产生: A ∩ B: 4,5 (A ∩ B) ∪ B: 4,5,6,7 如何在Objective-C中实现这一点?将NSArrays转换为NSSets,标准集操作可用 NSAr

我有两个NSArray A和B,它们共享一些共同元素,例如

A: 1,2,3,4,5 
B: 4,5,6,7
我想创建一个新的NSArray,它包含两个NSArray之间的公共内容,并与第二个NSArray的内容连接在一起,同时保持元素的顺序并删除重复项。也就是说,我想∩ (B)∪ B

在以前的NSArray上的操作将产生:

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

如何在Objective-C中实现这一点?

NSArray
s转换为
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)

NSLog输出:d:(6,4,7,5)


有一个
NSSet
类可以用来执行这些操作。

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

正如其他人所建议的,您可以使用
NSSet
轻松做到这一点。但是,这不会保留顺序


如果您希望保留顺序,并且可以以OSX10.7+为目标,那么您可以使用新的(和可变的子类)来做同样的事情∩ (B)∪ B总是会给你B,所以这是一个非常奇怪的计算方法。这就像说“给我一套所有颜色为绿色的汽车,再加上一套所有的汽车”。这将为您提供所有汽车的集合。

大多数似乎都忽略了维护秩序这一重要方面,这将NSSet排除在外。我的目标是iOS 4.3,它似乎没有OrderedSet库。还有其他想法吗?@Mat使用
NSSet
方法,然后手动从
B
中提取最终集合中的元素。你得自己维持秩序。再次感谢你的回复。我认为有一种比诉诸NSSet更好的方法,NSSet不能保持秩序。我可能需要编写自己的函数/库来实现这一点,但我想知道这些操作是否已经到位,这样我就不会重新发明轮子了。如果是这样的话,我可能会把它贴在这里,以防其他人遇到这种问题。@Mat我还想指出,“(A intersect B)union B”将始终导致“B”。Dave,你是对的,我在实现时意识到了这一点。我想要的是B所独有的。我相信这可以通过NOT(联合B)intersect NOT(B)来表达。这是否正确地代表了我想要的?谢谢你的更正!假设你想要比这更合理的东西,但是∩ (B)∪ B真的没有多大意义:只是B。
NSArray * a = [NSArray arrayWithObjects: ... ];
NSArray * b = [NSArray arratWithObjects: ... ];
NSMutableSet * set = [NSMutableSet setWithArray:a];
[set intersectSet:[NSSet setWithArray:b];
[set unionSet:[NSSet setWithArray:b];