1

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

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

我想要一个 aray 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];

编辑 正如评论中的建议和 H2CO3 所建议的那样,如果您没有正当理由使用NSArray,最方便的解决方案是更改数据结构并切换到NSSet支持集合差异的 ,使用方法-minusSet:

编辑 2 正如 Sven 在评论中指出的那样,您的对象必须正确响应hashisEqual:才能使用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 回答