快速提问。我有两个NSMutableArray:
Array 1: [A,B,C,D,E,F];
Array 2: [B,E,F];
请注意,数组2始终是数组1的子集-意味着存在的对象是数组2,当然也存在的对象也是数组1。
因此,我要构建的数组包含数组2中的不是的对象。
Array 3: [A,C,D];
我已经尝试使用this post中概述的相对补码,但生成的数组与数组1基本相同。它不会消除数组2中存在的对象。
我也尝试了answer here,但仍然没有得到我想要的。除非我真的做错了很明显的事情。
我猜想使用NSPredicate是更可取的。但是我愿意接受想法和暗示。
注意:仅出于上下文考虑,我这样做是为了更新UITableView,主要是出于数据过滤的目的。
谢谢!
更新
因此,到目前为止,所有给出的答案实际上对我来说都是一组简单的虚拟数据。但是,当我用实际数据进行测试时,创建的Array 3仍与Array 1相同。因此,我将提供有关我的资料的更多信息。
这两个数组都是
NSMutablArray
,用于存储字典对象。我实际上正在使用Parse.com,所以两个数组中的对象都是PFObject(如果我没记错的话,那只是NSObject)。我不知道这如何影响任何事情,但是是的,似乎没有用。当我尝试逐步执行此过程时,这是screenshot from the console。
到目前为止,感谢您的帮助。
最佳答案
您无需沿着谓词路线走,您可以清楚地知道要做什么,并且可以使用简单的本地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:
以提供更合理的相等性声明。例如,“根据“名称”属性的值,这些对象是否为同一对象”。由您决定什么使对象相等。
关于ios - 获取数组A与数组B交点的反面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22329863/