15

我有两个 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 中实现这一点?

4

5 回答 5

24

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]);

NSLog 输出:c: (4, 5)

[setA unionSet:setB];
NSLog(@"d: %@", [setA allObjects]);

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

于 2011-09-30T22:00:01.693 回答
15

正如其他人所建议的那样,您可以轻松地使用NSSet. 但是,这不会保留排序。

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

于 2011-09-30T22:16:05.257 回答
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:方法等。

于 2011-09-30T22:04:14.813 回答
2

(A ∩ B) ∪ B 总会给你 B,所以要计算这是一件很奇怪的事情。这就像说“给我所有绿色汽车的集合,以及所有汽车的集合”。这将为您提供所有汽车的集合。

于 2015-08-14T02:01:09.123 回答
0

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

于 2011-09-30T22:00:09.607 回答