Iphone NSDictionary中的键和值是否已排序?

Iphone NSDictionary中的键和值是否已排序?,iphone,cocoa-touch,uikit,nsdictionary,Iphone,Cocoa Touch,Uikit,Nsdictionary,我的意思是:NSDictionary中键和值的顺序是否总是与初始化NSDictionary时指定的顺序相同?或者,如果我真的需要知道钥匙的顺序,我最好保持一个单独的NSArray吗?不,它们没有顺序。只要不从字典中添加或删除任何元素,它们将保持相同的顺序,但只要添加或删除元素,新的顺序将完全不同 如果需要对键/值进行排序,请改用NSArray(或其他排序数据结构)。在访问NSDictionary时,决不能保证键的顺序相同。如果可以比较这些键(我假设它们可以给出您的问题),那么如果需要按排序顺序访

我的意思是:NSDictionary中键和值的顺序是否总是与初始化NSDictionary时指定的顺序相同?或者,如果我真的需要知道钥匙的顺序,我最好保持一个单独的NSArray吗?

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


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

在访问NSDictionary时,决不能保证键的顺序相同。如果可以比较这些键(我假设它们可以给出您的问题),那么如果需要按排序顺序访问它们,您可以始终对它们进行排序


要做到这一点,首先需要将键读入数组,然后对数组进行排序。

NSDictionary,根据,基本上是哈希表的包装器。所以不,它们不保证按任何特定顺序排列。

NSDictionary键和值不按顺序排列。您的选择:

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

马特·加拉赫(Matt Gallagher)写了一篇博客文章,标题是“完全涵盖这一问题”,并附有示例代码。

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

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


简而言之,决不能依赖NSDictionary中元素的顺序。您必须始终假定它们的顺序可能不明确,在不同的设备上可能不同。

它们如何访问该哈希表?我从未见过简单的哈希表,但想知道它是什么样子。这与在内部使用两个同步NSArray有很大区别吗?您是否在问哈希表作为数据结构是什么样子的?Wiki有一个很好的解释:如果你想知道苹果是如何具体实现和访问它们的,恐怕我们只有头文件;)因此,当我得到正确答案时,哈希表几乎就是一个哈希函数,它将为给定的字符串键+数组大小计算正确的数组索引。听起来很难实现,但对性能有好处。如果这是真的,那么在字典中添加多少项就无关紧要了。@kraag22:NSDictionary文档中没有任何地方对顺序做出任何承诺或保证,它只是说它提供了一个“管理键和值的不可变关联的对象的编程接口”。
-allKeys
-allValues
消息的文档确实指出,这些方法返回的顺序没有定义,尽管对于枚举字典元素的其他方法来说,将其变得更加明确可能不是一个坏主意。