【问题标题】:NSArray vs NSDictionary - Which is better for string searchingNSArray vs NSDictionary - 哪个更适合字符串搜索
【发布时间】:2014-05-03 20:33:17
【问题描述】:

我将在 plist 中存储一个值列表并检索它们。每次调用 search 方法时,都会在列表中搜索一个值(每次都可能更改)。列表中可能会有大约 10 个值。

NSArray 或 NSDictionary 哪个更适合搜索?

我认为 NSArray 更合适,因为至少现在我没有键值对数据集,只有一个列表。

有人可以确认并提供搜索数组的最佳方法吗?

谢谢

【问题讨论】:

  • 如果您只有 10 个项目,那么尝试实施一些更有效的东西是没有任何意义的。假设您可以在 1/1000000 秒内搜索数组,但字典在 1/100000 秒时更快。它有什么区别?只需做最简单的事情,如果您有数万个项目,只需担心这一点。

标签: ios objective-c search nsarray nsdictionary


【解决方案1】:

问题是概念性的:

如果您有一个价值列表,则您不得使用 NSDictionary。适当的数据结构NSArrayNSSet

基本上,NSSetNSArray,因为不必考虑顺序等。

因此,如果您只需要搜索一个值并且顺序无关紧要最好使用的数据结构是@987654325 @(或者 NSMutableSet 如果你需要它是可变的)。

【讨论】:

  • 谢谢Matteo,我要试试NSSet。听起来更快,而且由于我的值旁边没有密钥,所以这听起来最合适。
【解决方案2】:

字典比数组更快,因为键是散列的。对于数组,系统必须检查所有项目,直到找到匹配项。

NSSet 的文档说,在测试成员资格时,集合比数组更快。如果您没有要为每个键存储的值,最好的选择可能是将数据作为数组存储到您的 plist 中。在运行时,读取数组,并使用 NSSet 类方法 setWithArray: 将其内容加载到集合中

如果您的数据集很大(数千个项目),我建议使用字典进行性能测试,其中所有值都是针对 NSSet 的 NSNull。 (对于字典,您将使用 objectForKey:,对于集合,您将使用 containsObject: 方法

【讨论】:

    【解决方案3】:

    忽略计时最好的选择是使用 NSArray。 NSArray 有各种有用的方法,比如

    (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate
    

    (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate
    

    可用于在数组中搜索。

    【讨论】:

    • 也有这样的方法......在这种情况下比数组更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    相关资源
    最近更新 更多