比较两个数组并获得常用项

我有两个数组,但它们有不同的长度 。 我想比较这两个数组并将常用项放入一个新数组 。 同时不应该有重复的项目是第三个数组。 我真的搞砸了,请给我一个帮助。 非常感谢。 。 。

像这样的东西?

NSMutableSet* set1 = [NSMutableSet setWithArray:array1]; NSMutableSet* set2 = [NSMutableSet setWithArray:array2]; [set1 intersectSet:set2]; //this will give you only the obejcts that are in both sets NSArray* result = [set1 allObjects]; 

这样做的好处是不会查找数组中的对象,同时循环遍历另一个arrays,该arrays具有N ^ 2的复杂性,如果arrays很大,可能需要一段时间。

编辑:set2不必是可变的,也可以使用just

 NSSet* set2 = [NSSet setWithArray:array2]; 

第三种方法(除了使用集合或简单循环检查包含contains的每个项目)将对两个数组进行排序 ,然后使用两个索引:

 // approach using sets: NSArray *arrayUsingSets(NSMutableArray *arr1, NSMutableArray *arr2) { NSMutableSet *set1 = [NSMutableSet setWithArray: arr1]; NSSet *set2 = [NSSet setWithArray: arr2]; [set1 intersectSet: set2]; return [set1 allObjects]; } // my approach: NSArray *arrayUsingComp(NSMutableArray *arr1, NSMutableArray *arr2) { NSMutableArray *results = [NSMutableArray arrayWithCapacity: arr1.count + arr2.count]; // Assumes input arrays are sorted. If not, uncomment following two lines. // [arr1 sortUsingSelector: @selector(compare:)]; // [arr2 sortUsingSelector: @selector(compare:)]; int i = 0; int j = 0; while ((i < arr1.count) && (j < arr2.count)) { switch ([[arr1 objectAtIndex: i] compare: [arr2 objectAtIndex: j]]) { case NSOrderedSame: [results addObject: [arr1 objectAtIndex: i]]; i++, j++; break; case NSOrderedAscending: i++; break; case NSOrderedDescending: j++; break; } } // NOTE: results are sorted too. // NOTE 2: loop must go "backward". for (NSInteger k = results.count - 1; k > 0; k--) if ([[results objectAtIndex: k] isEqual: [results objectAtIndex: k-1]]) [results removeObjectAtIndex: k]; return results; } 

我做了一些简单的分析,如果我制作传入的数组的可变副本,并对它们进行排序,它的执行速度比使用集合的方法慢1.5倍 。 我上面的方法似乎比使用集合的方法快1.5倍 。 如果保证arrays已经被排序,我的方法将表现得更好( 几乎是使用集合的版本的4倍 ),因为不需要排序。

更新:

这并没有消除重复,所以我在例程结束时添加了循环。 现在它只是使用套装的方法的3倍 ,但仍然……

迭代array1并在array2中搜索它。 如果找到,请将其添加到array3(如果尚未添加)。

 for (MyObject* obj in array1) { if([array2 containsObject:obj] && ![array3 containsObject:obj]) [array3 addObject:obj]; } 

如果array1没有重复项,则不需要第二次检查。

HTH,

阿克沙伊