【问题标题】:Are keys and values in an NSDictionary ordered?NSDictionary 中的键和值是否有序?
【发布时间】:2010-11-20 16:40:49
【问题描述】:

我的意思是:NSDictionary 中键和值的顺序是否总是与初始化 NSDictionary 时指定的顺序相同?或者如果我真的需要知道键的顺序,我应该更好地维护一个单独的 NSArray?

【问题讨论】:

    标签: iphone cocoa-touch uikit nsdictionary


    【解决方案1】:

    不,它们没有被订购。只要您不从字典中添加或删除任何元素,它们将保持相同的顺序,但一旦您添加或删除一个元素,新的顺序将完全不同。

    如果您需要对键/值进行排序,请改用 NSArray(或其他一些有序数据结构)。

    【讨论】:

    • @kraag22:在NSDictionary 文档中没有任何地方对订单做出任何承诺或保证——它只是说它为管理键和值的不可变关联的对象提供了“编程接口” . -allKeys-allValues 消息的文档确实指出这些方法返回的顺序未定义,尽管对于枚举字典元素的其他方式更明确地说明这一点可能不是一个坏主意.
    【解决方案2】:

    NSDictionary 键和值没有排序。您的选择:

    • 按照您想要的顺序维护一个单独的键数组
    • 编写或查找作为上述包装器的现有类
    • 编写或查找现有的 NSDictionary 子类,该子类添加了用于排序的 API

    【讨论】:

      【解决方案3】:

      Matt Gallagher 写了一篇名为 “OrderedDictionary: Subclassing a Cocoa class cluster” 的博文,正好涵盖了这个问题,并附有示例代码。

      【讨论】:

        【解决方案4】:

        根据Apple's reference,NSDictionary 基本上是一个散列表的包装器。所以不,不能保证它们按任何特定顺序排列。

        【讨论】:

        • 他们如何访问该哈希表?从未见过普通的哈希表,但想知道它的样子。这与在内部使用两个同步 NSArray 有很大不同吗?
        • 您是否在问哈希表作为一种数据结构是什么样的? Wiki 有一个很好的解释:en.wikipedia.org/wiki/Hash_table 如果你想知道苹果具体是如何实现和访问它们的,恐怕我们唯一可用的就是头文件;)
        • 所以当我做对时,哈希表几乎都是关于哈希函数的,它将计算给定字符串键 + 数组大小的正确数组索引。听起来很难实现,但对性能有好处。如果这是真的,那么向字典中添加多少项并不重要。
        【解决方案5】:

        在访问 NSDictionary 时,永远不能保证键的顺序相同。如果可以比较键(我假设它们可以给出你的问题),那么如果你需要按排序顺序访问它们,你总是可以对它们进行排序。

        您需要首先将键读入一个数组,然后对数组进行排序。

        【讨论】:

          【解决方案6】:

          事实上,即使是完全相同的程序和完全相同的操作系统版本,在两个不同的设备上运行程序时,您甚至不能依赖于顺序相同。

          例如,如果您在 iPad Air 上运行程序,则 NSDictionary 中元素的顺序可能与在 iPad Retina 上运行相同程序时不同,即使 iOS 版本完全相同。

          简而言之,绝不能依赖 NSDictionary 中元素的顺序。您必须始终假设它们可能以任何未指定的顺序排列,在不同的设备上可能会有所不同。

          【讨论】:

            猜你喜欢
            • 2015-08-23
            • 1970-01-01
            • 2010-09-27
            • 1970-01-01
            • 1970-01-01
            • 2015-11-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多