快速提问。我有两个NSMutableArray:
Array 1: [A,B,C,D,E,F];
Array 2: [B,E,F];
请注意,数组2始终是数组1的子集 - 意味着存在的对象是数组2,也确实存在于数组1中。
所以我想要的是构建一个包含数组2中 NOT 对象的数组。就像这样
Array 3: [A,C,D];
我已尝试使用this post中概述的相对补码,但结果数组与数组1基本相同。它不会消除数组2中存在的对象。
我也试过answer here,但仍然没有得到我想要的东西。除非我真的做了一件非常明显错误的事情。
我猜,使用NSPredicate是更可取的。但我对想法和提示持开放态度。
注意:仅针对上下文,我这样做是为了更新我的UITableView,主要用于数据过滤。
谢谢!
更新
所以到目前为止给出的所有答案实际上都适用于我的简单虚拟数据集。但是当我使用我的真实数据进行测试时,创建的阵列3仍然与阵列1相同。因此,我将提供有关我的东西的更多信息。
两个数组都是NSMutablArray
,用于存储字典对象。我实际上使用的是Parse.com,因此两个数组中的对象都是PFObject(如果我没有弄错的话,这只是NSObject)。我不知道这对任何事情有什么影响,但是,似乎没有效果。
当我尝试逐步完成整个过程时,这是一个screenshot from the console。
感谢你们的帮助。
答案 0 :(得分:5)
这里没有必要沿着谓词路线走,你明确知道你想做什么,并且可以用简单的原生API来表达。
NSMutableArray *mArray3 = [NSMutableArray arrayWithArray:array1];
[mArray3 removeObjectsInArray:array2];
NSArray* array3 = [mArray3 copy];
需要注意的重要事项:
removeObjectsInArray:
此方法假定otherArray中的所有元素都响应hash和isEqual:。
对于被视为相等的对象,他们需要响应hash
和isEqual:
,并且要在两个相等对象之间匹配这些值。一篇关于平等的好文章can be read here。
如果PFObject
只是从NSObject继承,那么相等检查将是非常基本的。它只是通过询问"这些对象是否是基于内存中的位置的相同对象来检查是否相等?"。这可能解释了为什么你的虚拟数据有效,但实际数据没有。
您需要对PFObject进行子类化以使其了解内容。这意味着您可以覆盖hash
和isEqual:
以提供更合理的相等声明。例如,"这些对象是否是同一个对象,基于' name'的值。属性&#34 ;.由您来定义使对象相等的内容。
答案 1 :(得分:1)
WDUK的答案可能是要走的路,因为它更简单,只需要一个新对象(加上一个副本)。但是,如果您喜欢离散数学,NSMutableSet
允许您执行集合运算。也就是说,对你的问题的另一个(过于复杂,但非常具有描述性)答案是:
// convert arrays to sets.
// since array2 is always a subset of array1, we don't need to create a union set.
NSMutableSet *set1 = [NSMutableSet setWithArray:array1];
NSSet *set2 = [NSSet setWithArray:array2];
// find intersecting objects
NSMutableSet *intersection = [NSMutableSet setWithSet:set1];
[intersection intersectSet:set2];
// remove intersecting objects (result: your desired set)
[set1 minusSet:intersection];
NSArray *nonIntersectingObjects = [set1 allObjects];
正如WDUK建议的那样,使用NSMutableArray
可以轻松解决您的问题。但是,当出现类似但更复杂的问题时,设置操作可能会提供更简单,更优雅的解决方案。
答案 2 :(得分:1)
如果你想在这里使用谓词来做到这一点:
NSArray* array1= @[@'A',@'B',@'C',@'D',@'E',@'F'];
NSArray* array2= @[@'B',@'E',@'F'];
NSPredicate* predicate= [NSPredicate predicateWithFormat: @"not(self in %@)",array2];
NSArray* array3=[array1 filteredArrayUsingPredicate: predicate];
SELF
表示数组中的计算对象。 IN
运算符可用于检查集合中是否有任何对象,这里有一些参考:Predicate programming guide / aggregate operations