1

非常に単純な問題です。私は正しい軌道に乗っています。述語を使用する必要がありますが、解決策が見つかりませんでした。私は2つの配列を持っています:

A = [1, 2, 3, 4]
B = [1, 2]

配列 C = A \ B が欲しい

C = [3, 4]
4

3 に答える 3

8

タスクに適したツールを使用してください。ここで説明しているのは、集合操作の「違い」です。

NSMutableSet *first = [NSMutableSet setWithObjects:@1, @2, @3, @4, nil];
NSSet *second = [NSSet setWithObjects:@1, @2, nil];
[first minusSet:second];

配列を操作する必要がある場合は、配列とセットの間で変換することもできます。

NSArray *array = [someSet allObjects];

また

NSSet *set = [NSSet setWithArray:someArray];
于 2013-04-07T21:14:39.570 に答える
3

あなたはそれを達成することができますremoveObjectsFromArray:

NSArray * arrayA = @[ @1, @2, @3, @4 ];
NSArray * arrayB = @[ @1, @2 ];

NSMutableArray * arrayC = [arrayA mutableCopy];
[arrayC removeObjectsInArray:arrayB];

EDIT コメントで提案され、H2CO3によっても提案されているように、 を使用する正当な理由がない場合NSArray、最も便利な解決策は、データ構造を変更NSSetし、メソッドを使用して集合差をサポートする に切り替えること-minusSet:です。

編集 2 Sven がコメントで指摘したように、オブジェクトは に適切に応答し、使用する必要がhashありisEqual:ますremoveObjectsInArray:。上記の例でNSNumberは、これらのメソッドのデフォルトの実装があるため、すべて問題なく動作しますが、カスタム クラスを使用している場合は、それらを明示的にオーバーライドする必要があります。

于 2013-04-07T21:12:29.077 に答える
0

別のアプローチを次に示します。

NSArray * arrayA = @[ @1, @2, @3, @4 ];
NSArray * arrayB = @[ @1, @2 ];

NSIndexSet *indexSet = [arrayA indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    if([arrayB containsObject:obj]){
        return NO;
    }
    else{
        return YES;
    }
}];

NSArray *arrayC = [arrayA objectsAtIndexes:indexSet];
于 2014-05-04T19:09:36.223 に答える