我有两个 NSArrays A 和 B 共享一些共同的元素,例如
A: 1,2,3,4,5
B: 4,5,6,7
我想创建一个新的 NSArray,其中包含两个 NSArray 之间的共同内容以及第二个 NSArray 的内容,同时保持元素的顺序并删除重复项。也就是说,我想要 (A ∩ B) ∪ B。
对先前 NSArrays 的操作将产生:
A ∩ B: 4,5
(A ∩ B) ∪ B: 4,5,6,7
我如何在 Objective-C 中实现这一点?
我有两个 NSArrays A 和 B 共享一些共同的元素,例如
A: 1,2,3,4,5
B: 4,5,6,7
我想创建一个新的 NSArray,其中包含两个 NSArray 之间的共同内容以及第二个 NSArray 的内容,同时保持元素的顺序并删除重复项。也就是说,我想要 (A ∩ B) ∪ B。
对先前 NSArrays 的操作将产生:
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)
[setA unionSet:setB];
NSLog(@"d: %@", [setA allObjects]);
NSLog 输出:d: (6, 4, 7, 5)
正如其他人所建议的那样,您可以轻松地使用NSSet
. 但是,这不会保留排序。
如果您想保留顺序并且可以针对 OS X 10.7+,那么您可以使用新的NSOrderedSet
(和可变的子类)来做同样的事情。
正如其他人指出的那样,通过使用 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:
方法等。
(A ∩ B) ∪ B 总会给你 B,所以要计算这是一件很奇怪的事情。这就像说“给我所有绿色汽车的集合,以及所有汽车的集合”。这将为您提供所有汽车的集合。
有一个NSSet
类可以用来执行这些操作。