快速检查一个对象数组的属性是否与另一个对象数组的属性重叠的方法

时间:2016-01-06 21:30:30

标签: objective-c nsarray nsdictionary

我想知道是否有更好的方法来执行以下操作:

for( customObject *myObject in self.myObjects ) {
    myObjectsDictionary[myObject.objectID] = customObject;
}

基本上我有很长的自定义对象。每个对象都应具有唯一的标识号。因此,在添加新对象之前,我创建了一个ID号字典,以便我可以根据这些现有ID号检查新建议的ID号并消除重复。这似乎效率低下......是否有明显的语言功能可以更快/更好地完成这项工作?

我想到的是设置......我可以创建一组这些objectID,然后检查新对象的id对旧的。这比上面好吗?如果是这样,为什么?如果没有,还有另一种选择吗?

2 个答案:

答案 0 :(得分:0)

在广泛的笔触级别,您的词典解决方案相当于使用NSSet。一个人可能在效率上产生真正差异的方式将是一种不同的算法(不同于在词典和集合中使用的NSObject hash的隐式使用)。

例如,基于密钥(see here)构建的尝试将按密钥长度进行扩展。它是否比给定长度密钥的哈希更快是一个经验问题。

要记住的重要原则是首先做出合理的决定(字典和集合都非常合理),除非有明确的需要,否则不要进一步优化。

答案 1 :(得分:0)

NSSet优于NSDictionary,因为前者仅存储objectID引用,后者也存储customObject引用。< / p>

如果您的objectID实际上是整数类型的盒装(NSNumber)或文本(NSString)版本,那么您可以使用可存储整数的CFSet(如void *)直接保存所有拳击。

NS个集合将使用在hash类型上定义的objectID函数,该函数可以被覆盖; CFSet使用默认值或创建时提供的默认值。如果您依赖于默认的哈希函数并且该哈希对于您的特定数据集不是最佳的,那么您可以考虑实现自己的哈希函数 - 但只有在遇到性能问题时才会去那里。

HTH