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

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

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

我想从大数组中删除共同元素(dictionay1)

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

 [bigArray removeObjectsInArray:smallArray]; 

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

如果每个元素都是不同的(就像你在评论中所说的那样),那么你可以使用一个谓词来过滤这个数组,这个谓词将删除这个较小子集中的所有对象。 既然你在你的问题中使用了一个数组,我假定对象的顺序很重要。

如果你需要保存顺序,那么你将需要过滤数组。 转换为一个集合将会打断这个命令(除非你能够在之后进行处理。

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

 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重复将被删除,在这种情况下,你不应该使用它。 第二件事是它可以改变你的数组中的元素的顺序。