2011-04-09 64 views
1

所以我有多个NSArrays(实际上是5),我想创建一个新的NSArray,它只包含所有数组通用的对象。有没有一种有效的方法来做到这一点。我能想到的唯一方法是循环遍历所有比较每个对象的数组。多个NSArray的和普通的对象

+0

我认为你必须通过他们循环... – 2011-04-10 00:12:03

+0

你提到发现在评论一个简单的解决方案关于上一个问题。你能详细说明一下吗? – ChrisHaze 2015-07-22 03:40:08

+0

@ChrisHaze啊对不起,我用我的解决方案编辑了我原来的问题。我把它添加为一个新的答案,并接受它是正确的。 :) – gypsyDev 2015-07-22 10:02:54

回答

3

最后我用这里面工作的很好:

NSMutableSet *set = [NSMutableSet setWithArray:array]; 
NSMutableSet *set1 = [NSMutableSet setWithArray:array2]; 
NSMutableSet *set2 = [NSMutableSet setWithArray:array3]; 
NSMutableSet *set3 = [NSMutableSet setWithArray:array4]; 
NSMutableSet *set4 = [NSMutableSet setWithArray:array5]; 

[set intersectSet:set1]; 
[set intersectSet:set2]; 
[set intersectSet:set3]; 
[set intersectSet:set4]; 

NSArray *allArray = [set allObjects]; 
+0

我的目标是统计匹配实例的总数,并准备一个类似的情况,但不完全。感谢您发布它:我已经决定采用NSCountedSet方法,将所有NSArrays的内容转储到其中,并且它似乎正在工作。虽然我不确定可扩展性。再次感谢@gypsyDev – ChrisHaze 2015-07-22 20:17:27

3

为什么不创建一个NSSet(NSMutableSet,真的),将所有5个数组的内容转储到它中,然后从NSSet构造一个新的NSArray?

对不起,我最初误解了你的问题。是的,我认为你几乎必须循环遍历每一个来找到重复。但是实现起来并不是很糟糕(但是如果你的数组很庞大,运行时可能会稍微慢一些)。

下面是一些示例代码:

- (void) filterSet: (NSMutableSet*)set withArray: (NSArray*) array { 
    NSMutableSet* removals = [NSMutableSet setWithCapacity:[array count]]; 
    for (id obj in set) { 
     if (! [array containsObject: obj]) { 
      [removals addObject: obj]; 
     } 
    } 
    [set minusSet: removals]; 
} 

NSMutableSet* mySet = [NSMutableSet setWithCapacity:[array1 count] * 5]; 
[mySet addObjectsFromArray: array1]; 
[self filterSet: mySet withArray: array2]; 
[self filterSet: mySet withArray: array3]; 
[self filterSet: mySet withArray: array4]; 
[self filterSet: mySet withArray: array5]; 

NSArray* filteredArray = [mySet allObjects]; 
+0

这将创建一个包含所有对象的数组,但我只是想重复。我认为NSSet是我正在寻找的,但我发现这种方法:intersectSet: – gypsyDev 2011-04-09 23:57:40

+0

@gypsyDev - 啊,对不起,你想要所有的重复。这是相反的。我误解了,并认为你想要所有的独特。 – aroth 2011-04-10 00:00:56

+0

@gypsyDev - 好吧,我打补丁找到/保留重复。 – aroth 2011-04-10 00:13:09