2011-04-09 63 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