比较两个NSArray& amp;使用两者中没有出现的对象填充第三个?

时间:2013-01-16 16:59:41

标签: iphone ios objective-c xcode nsmutablearray

我是iOS和目标C的新手,我正在努力想出我可以做的事情来实验和自学。我也想学习以正确的方式做事,这在你自己学习的过程中很难。

我想拍摄两张看起来像

的NSArray

数组1: - Object1:@“你好” - 对象2:@“这个” - 对象3:@“是一个” - 对象4:@“测试”

ARRAY2: - Object1:@“你好” - Object2:@“是一个”

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

ARRAY3: - 对象1:@“这个” - 对象2:@“测试”

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

我是记忆管理的新手(我知道ARC现在在这里,但我现在正努力做旧学校,我认为这是一项重要的学习技巧)所以我只想知道是否有这是一个更好的方法。

提前感谢任何帮助,欢呼声

3 个答案:

答案 0 :(得分: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个对象),当你需要像交集这样的操作时这是更好的选择或差异或联盟。

答案 1 :(得分: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中自动释放的。

答案 2 :(得分: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)