通过交叉和联合组合NSArrays

Mat*_*lly 15 union set-theory objective-c nsarray

我有两个共享一些共同元素的NSArrays A和B,例如

A: 1,2,3,4,5 
B: 4,5,6,7
Run Code Online (Sandbox Code Playgroud)

我想创建一个新的NSArray,它包含两个NSArrays之间共同的内容,它们与第二个NSArray的内容相连,同时保持元素的顺序并删除重复项.也就是说,我想(A∩B)∪B.

以前的NSArrays上的操作将产生:

A ? B: 4,5
(A ? B) ? B: 4,5,6,7
Run Code Online (Sandbox Code Playgroud)

我如何在Objective-C中实现这一目标?

zap*_*aph 22

NSArrays 转换为NSSets,标准集操作可用.

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]);
Run Code Online (Sandbox Code Playgroud)

NSLog输出:c:(4,5)

[setA unionSet:setB];
NSLog(@"d: %@", [setA allObjects]);
Run Code Online (Sandbox Code Playgroud)

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


Dav*_*ong 15

正如其他人所建议的那样,你可以轻松地做到这一点NSSet.但是,这不会保留订购.

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

  • @Mat我还想指出"(A交叉B)联合B"将*总是*导致"B". (2认同)

Ben*_*tto 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];
Run Code Online (Sandbox Code Playgroud)

这会照顾欺骗,但不会保留秩序.您将结果置于"set"中并将它们排序回一个数组.没有本地收集功能可以完成所有工作 - 如果您希望保持订单并分别担心欺骗,请使用NSMutableArray的-removeObjectsInArray:方法等.