一个3200字典的.plist

时间:2011-07-11 08:07:25

标签: objective-c cocoa-touch nsarray plist nsdictionary

我有一个包含3200个字典的plist。每个字典有20个键/值。搜索它的最佳方法是什么?

我有一个名为“id”的字符串,我现在正在做的是,迭代遍历数组的所有元素,向每个元素(字典)询问键“id”的值,将该id与其他id进行比较我有,如果发现了,就打破。

这真的很慢,就像我可以看到大约1-2秒的滞后。有没有更好的办法? 感谢

3 个答案:

答案 0 :(得分:2)

您现在正在做的是O(n)操作(列表中项目数量的线性)。如果您保留另一个“lookaside”数据结构,可以帮助您索引列表,则可以获得“常量时间”O(1)查找。

在编写3200项词典列表之前,请创建一个特殊字典,将您的ID映射到大数组中的索引。换句话说,每个键都是一个ID,其值将是一个NSNumber,其索引号为大数组。然后保存它(在相同的plist或单独的plist中)。

然后,当您需要进行查找时,只需在旁视词典中执行-objectForKey:,这将立即返回您正在查找的条目的索引。

如果您使用实时数据更新它们,请确保您的后备词典始终保持同步。请注意,这也假设您的ID是唯一的(听起来像是)。

答案 1 :(得分:1)

为什么不使用SQLite数据库?

答案 2 :(得分:0)

我注意到的第一件事是你似乎总是在同一个id键上搜索。如果是这种情况,那么您应该根据id对字典数组进行排序。然后,您可以对已排序的数组执行二进制搜索。结果:按id查找任何字典最多需要12次操作。相比之下,通过3200个项目的线性搜索平均为1600次操作,可能需要多达3200次。

如果你需要搜索几个不同的密钥,并且所有这些字典都具有相同的密钥,那么核心数据可能是一个非常好的解决方案。 NSManagedObject的工作方式与NSMutableDictionary非常相似,但框架将为您处理索引,并且搜索速度快且相对容易。