如何比较和删除公共对象(nsdictionary)从2 NSMutableArray



我有两个nsmutablearray,用字典对象填充,比如

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

我想从大数组

中删除公共元素(dictionay1)

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

[bigArray removeObjectsInArray:smallArray];

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

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

如果需要保留顺序,则需要对数组进行过滤。转换为集合将打破顺序(除非您能够在之后使用它)。

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

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];
}]];

NSSet是做这种工作的完美类。试着,

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

值得指出的是,如果你的数组将存储副本并且你将它转换为NSSet,副本将被删除,在这种情况下你不应该使用它。第二,它可以改变数组中元素的顺序

最新更新