3

arr1、arr2、arr3の3つの可変配列があるとしましょう。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]];
  }
}
4

2 に答える 2

8

配列に別の配列のすべての要素が含まれているかどうかを確認する最良の方法は、NSSetを操作することです。NSSetは、個別のオブジェクトの静的セットになります。つまり、配列からセットを作成すると、そのセットには、配列内の個別のオブジェクトごとに1つのエントリのみが含まれます。つまり、配列にはオブジェクトの複数のコピーを含めることができ、セットには各オブジェクトのコピーを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]];
}
于 2012-04-23T17:47:16.043 に答える
2

6行のコードで完了:

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

    return [resultSet allObjects];
}

NSSetの基になるバッファを直接コピーできるためNSArray、パフォーマンスの面で非常に効果的です。

必要に応じて、これをカテゴリに簡単に変換することもできます。

于 2012-04-23T17:39:09.200 に答える