【问题标题】:A .plist of 3200 dictionaries包含 3200 个词典的 .plist
【发布时间】:2011-07-11 08:07:25
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您现在正在做的是 O(n) 操作(与列表中的项目数成线性关系)。如果您保留另一个“后备”数据结构来帮助您在列表中建立索引,则可以获得“恒定时间”O(1) 查找。

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

    然后,当您需要查找时,只需在后备字典中执行-objectForKey:,它会立即返回您正在查找的条目的索引。

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

    【讨论】:

      【解决方案2】:

      为什么不使用 SQLite 数据库?

      【讨论】:

      • 感谢您的回复。因为几个原因。首先,我对数据库没有经验(虽然我想学习它,但我没有时间)。其次,因为大部分应用都是用 plist 完成的,所以需要重写所有内容。
      • 使用数据库并不复杂。你也可以享受索引的力量。您更清楚自己的应用需要做出多少改变...
      • 你可以使用 fmdb,一个围绕 SQLite 的 Objective-C 包装器
      【解决方案3】:

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

      如果您需要搜索几个不同的键,并且所有这些字典都具有相同的键,Core Data 可能是一个非常好的解决方案。 NSManagedObject 的工作方式与 NSMutableDictionary 很相似,但该框架会为您处理索引,而且搜索速度快且相对容易。

      【讨论】:

        猜你喜欢
        • 2014-12-16
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多