0

我是 iOS 和 Objective C 的新手,我正在尝试想出一些我可以做的事情来实验和自学。我也想学习以正确的方式做事,这在自己学习时可能会很困难。

我想要 2 个可能看起来像的 NSArray

Array1: - Object1:@“Hello” - Object2:@“This” - Object3:@“Is a” - Object4:@“Test”

Array2: - Object1: @"Hello" - Object2: @"Is a"

并创建第三个数组,其中包含那些没有出现在我比较过的两个数组中的对象,所以结果是

Array3: - Object1: @"This" - Object2: @"Test"

我想我可以遍历每个数组并使用 foreach 遍历每个对象,它将每个对象与第二个数组中的对象列表进行比较,如果找不到,则将 array1 的对象添加到 array3。

我是内存管理的新手(我知道 ARC 就在这里,但我现在正努力成为老派,我到处都说这是一项重要的学习技能)所以我只是想找出是否有更好的方法去做这个。

提前感谢您的帮助,干杯

4

3 回答 3

4

您可能想要使用集合进行操作。

目标 C 中的对称差异:

NSSet *set1 = [NSSet setWithObjects:@"Hello", @"This", @"Is a", @"Test", nil];
NSSet *set2 = [NSSet setWithObjects:@"Hello", @"Is a", nil];

NSMutableSet *notInSet1 = [NSMutableSet setWithSet:set2];
[notInSet1 minusSet:set1];
NSMutableSet *notInSet2 = [NSMutableSet setWithSet:set1];
[notInSet2 minusSet:set2];

NSMutableSet *symmetricDifference = [NSMutableSet setWithSet:notInSet1];
[symmetricDifference unionSet:notInSet2];

您应该为您的任务使用集合的原因是因为集合包含唯一的对象(即它们不能包含两个@"42" NSString对象),当您需要像交集、差集或并集这样的操作时,这是更可取的。

于 2013-01-16T17:19:48.367 回答
0

有很多方法可以做到这一点。如果您想使用框架数组方法来做到这一点,这可能是一个好方法:

NSArray *Array1 = [NSArray arrayWithObjects:@"One", @"Two", @"Three", nil];
NSArray *Array2 = [NSArray arrayWithObjects:@"Two", @"Four", @"One", nil];
NSMutableArray *Array3 = [NSMutableArray arrayWithArray:Array1];
[intermediate removeObjectsInArray:Array2];

你不需要关心释放这个数组,因为它们是从 arraywithObjects 和 arrayWithArray 自动释放的。

于 2013-01-16T17:03:00.437 回答
0

如果您要NSString在示例代码中使用对象,我将迭代第一个数组并将这些字符串作为键添加到NSMutableDictionary(例如[dict setValue:[NSNumber numberWithBool:YES] forKey:str_object_here];

创建第三个数组(您的最终输出,使用[[NSArray alloc] initWithCapacity:min_count]其中 min_count 是较小数组的大小)

然后迭代第二个数组并为每个项目检查它是否作为字典中的键存在,如果不将其添加到第三个(最终输出)数组中

由于字典针对键查找进行了优化(如果我没记错的话,应该是 O(1),在内部正确使用散列),你正在从 O(N^2) 移动到 O(N)

于 2013-01-16T18:03:55.173 回答