非常に単純な問題です。私は正しい軌道に乗っています。述語を使用する必要がありますが、解決策が見つかりませんでした。私は2つの配列を持っています:
A = [1, 2, 3, 4]
B = [1, 2]
配列 C = A \ B が欲しい
C = [3, 4]
非常に単純な問題です。私は正しい軌道に乗っています。述語を使用する必要がありますが、解決策が見つかりませんでした。私は2つの配列を持っています:
A = [1, 2, 3, 4]
B = [1, 2]
配列 C = A \ B が欲しい
C = [3, 4]
タスクに適したツールを使用してください。ここで説明しているのは、集合操作の「違い」です。
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];
あなたはそれを達成することができます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
は、これらのメソッドのデフォルトの実装があるため、すべて問題なく動作しますが、カスタム クラスを使用している場合は、それらを明示的にオーバーライドする必要があります。
別のアプローチを次に示します。
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];