2012-04-23 122 views
3

假設我有三個可變陣列:arr1,arr2和arr3。我想比較arr1中的所有元素與arr2中的每個元素,並且如果arr2中的元素包含arr1中的所有元素,我想將它添加到arr3。所以我認爲它會看起來像我的代碼下面。 objective-c中是否有一些智能功能,我不知道,或者有什麼辦法可以做到這一點?比較一個陣列中的所有元素與其他陣列

for(int i; i < arr2.count; i++) 
{ 
    if([arr2 objectAtIndex:i] containAllElementsInArray:arr1]]) 
    { 
    [arr3 addObject:[arr2 objectAtIndex:i]]; 
    } 
} 
+1

換句話說,ARRAY3應該包含Array1和Array2的交集,正確嗎? – Till 2012-04-23 17:02:19

+0

是的,我想是這樣:) – 2012-04-23 17:04:36

+1

我沒有看到'arr1'在你的代碼中的任何地方。仍然試圖弄清楚你是否想要一個交集或其他行爲(即:「如果'arr2'中的元素包含'arr1'中的所有元素」) – 2012-04-23 17:23:36

回答

8

查看數組是否包含另一個數組的所有元素的最佳方法是使用NSSets。 NSSet將是一組不同的對象的靜態集合,這意味着當您從一個數組創建一個集合時,該集合將僅包含數組中每個對象的1個條目。換句話說,一個數組可以有一個對象的多個副本,一個集合將只有每個對象的一個​​副本。

使用的NSSet的最重要的部分是調用isSubsetOfSet方法的能力:

isSubsetOfSet:返回一個布爾值,它指示每一 對象在接收組是否也存在於另一給定集。

- (BOOL)isSubsetOfSet:(NSSet *)otherSet 

您將需要創建從ARR1一組,並比較這對在ARR2每個元素,看它是否是該元素的一個子集...

NSSet *arr1set = [NSSet setWithArray:arr1]; 
NSSet *arr2set = [NSSet setWithArray:[arr2 objectAtIndex:i]]; 

if ([arr1set isSubsetOfSet:arr2set]) { 
    // then the element [arr2 objectAtIndex:i] contains all the elements of arr1 
    [arr3 addObject:[arr2 objectAtIndex:i]]; 
} 
+0

看來這個答案完全符合OP所要求的。榮譽給你破譯它:D – Till 2012-04-23 19:07:14

+0

真棒..這是完美的.. – rishi 2012-04-24 05:30:29

2

完成,在6行的代碼:

NSArray *intersectArray(NSArray *arr1, NSArray *arr2) 
{ 
    NSMutableSet *resultSet = [NSMutableSet setWithArray:arr1]; 
    [resultSet intersectSet:[NSSet setWithArray:arr2]]; 

    return [resultSet allObjects]; 
} 

由於NSSet可以直接複製NSArray的基礎緩衝區,這應該是作爲去性能方面非常有效。

這也可以很容易地轉換爲一個類別,如果你願意。