非常简单的问题,我在正确的轨道上,我必须使用谓词但找不到解决方案。我有两个数组:
A = [1, 2, 3, 4]
B = [1, 2]
我想要一个 aray C = A \ B 是
C = [3, 4]
非常简单的问题,我在正确的轨道上,我必须使用谓词但找不到解决方案。我有两个数组:
A = [1, 2, 3, 4]
B = [1, 2]
我想要一个 aray 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];
编辑
正如评论中的建议和 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];