如何比较和删除2 NSMutableArray中的公共对象(NSDictionaries)?

时间:2014-05-28 09:24:07

标签: ios objective-c cocoa-touch

我有两个NSMutableArrays,填充了字典对象,比如

NSMutableArray * bigArray = @[dictionary1,dictionary2,dictionary3];
NSMutableArray * smallArray = @[dictionary1];

我想从大数组中删除常用元素(dictionay1)

注意:小数组是大数组的子集,元素是不同的

3 个答案:

答案 0 :(得分:2)

[bigArray removeObjectsInArray:smallArray];

删除bigArray中包含的smallArray中的所有对象。

答案 1 :(得分:1)

如果每个元素都是不同的(正如您在注释中所说的那样),那么您可以使用谓词过滤数组,该谓词将删除较小子集内的所有对象。由于您在问题中使用数组,我认为对象的顺序很重要。

如果您需要保留订单,则需要过滤数组。转换为一个集会破坏顺序(除非您之后能够使用它。

你在问题​​中使用可变数组,所以我也会这样做。请注意,原始数组实际上已被修改:

NSMutableArray *original = [NSMutableArray arrayWithArray:@[@"A", @"E", @"C", @"B", @"D"]];
NSMutableArray *subset   = [NSMutableArray arrayWithArray:@[@"C", @"B"]];

NSLog(@"before : %@", original);

[original filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    // return YES for objects to keep
    return ![subset containsObject:evaluatedObject];
}]];

NSLog(@"after : %@", original);

此代码的输出为:

before : (
    A,
    E,
    C,
    B,
    D
)
after : (
    A,
    E,
    D
)

您可以看到订单已保留。


如果您不想修改原始数组,则可以生成新的过滤数组。不同之处在于您拨打filteredArrayUsingPredicate:而不是filterUsingPredicate:。谓词是相同的:

NSArray *filtered = [original filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    // return YES for objects to keep
    return ![subset containsObject:evaluatedObject];
}]];

答案 2 :(得分:0)

NSSet是完成这类工作的完美课程。试试吧;

NSMutableSet *bigSet = [NSMutableSet setWithArray:bigArray];
[bigSet minusSet:[NSMutableSet setWithArray:smallArray]];
bigArray = [[bigSet allObjects] mutableCopy];

值得指出的是,如果您的数组将存储重复数据并将其转换为NSSet,则会删除副本,在这种情况下您不应该使用它。第二件事是它可以改变数组中元素的顺序。