非常简单的问题,我在正确的轨道上,我必须使用谓词,但无法找到解决方案。 我有两个数组:
A = [1, 2, 3, 4]
B = [1, 2]
我希望有一个C = A \ B的aray
C = [3, 4]
答案 0 :(得分: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];
答案 1 :(得分:3)
您可以使用removeObjectsFromArray:
NSArray * arrayA = @[ @1, @2, @3, @4 ];
NSArray * arrayB = @[ @1, @2 ];
NSMutableArray * arrayC = [arrayA mutableCopy];
[arrayC removeObjectsInArray:arrayB];
修改强>
正如评论中所建议的以及H2CO3提出的那样,如果您没有合理的理由使用NSArray
,最方便的解决方案是更改数据结构并切换到NSSet
,它有支持对于设定差异,使用方法-minusSet:
。
编辑2
正如Sven在评论中指出的那样,您的对象必须正确回复hash
和isEqual:
才能使用removeObjectsInArray:
。在上面的例子中,一切都会被罚款,因为NSNumber
有这些方法的默认实现,但是如果你使用自定义类,你需要显式覆盖它们。
答案 2 :(得分: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];