Objective-C中两个数组的补充

时间:2013-04-07 21:08:53

标签: ios objective-c arrays

非常简单的问题,我在正确的轨道上,我必须使用谓词,但无法找到解决方案。 我有两个数组:

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

我希望有一个C = A \ B的aray

C = [3, 4]

3 个答案:

答案 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在评论中指出的那样,您的对象必须正确回复hashisEqual:才能使用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];