2012-04-23 14 views
3

私は3つのmutable配列arr1、arr2、arr3を持っているとしましょう。 arr1のすべての要素をarr2の各要素と比較したいのですが、arr2の要素にarr1の要素がすべて含まれている場合は、arr3に追加します。だから、私はそれが私のコードのようなものになると思っている。客観的に何らかのスマートな機能があるのですか?これについてはわかりません。ある配列のすべての要素を他の配列と比較する

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

、ARRAY3 Array1とArray2の交点を含むべきですか? – Till

+0

ええ、私はそう思います。 –

+1

あなたのコードのどこにでも 'arr1'が表示されません。あなたが交差点や別の振る舞いが必要かどうかを調べようとしています(「arr2の要素に 'arr1'のすべての要素が含まれている場合」) –

答えて

8

アレイに別のアレイのすべての要素が含まれているかどうかを確認する最も良い方法は、NSSetsで作業することです。 NSSetは異なるオブジェクトの静的なセットになります。つまり、配列からセットを作成すると、配列内のすべてのdisctintオブジェクトに1つのエントリしか含まれません。言い換えれば、配列はオブジェクトの複数のコピーを持つことができ、セットは各オブジェクトのコピーを1つしか持たない。

isSubsetOfSet:

NSSetを使用しての重要な部分は、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

+0

素晴らしい...これは完璧です.. – rishi

2

は、コードの6行で、完了:

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

    return [resultSet allObjects]; 
} 

NSSetが直接NSArrayの根底にあるバッファをコピーすることができますので、これはパフォーマンス行くの条件として非常に有効である必要があります。

これはまた、必要に応じて非常に簡単にカテゴリに変換することができます。

関連する問題