如果 NSDictionary 键顺序从不改变,它是不是保证与初始化相同?

Posted

技术标签:

【中文标题】如果 NSDictionary 键顺序从不改变,它是不是保证与初始化相同?【英文标题】:Is NSDictionary key order guaranteed the same as initialized if it never changes?如果 NSDictionary 键顺序从不改变,它是否保证与初始化相同? 【发布时间】:2010-03-22 23:14:33 【问题描述】:

我遇到了与 in this question 相同的问题。但是,我有一个后续问题。我似乎与最初的提问者处于相同的情况:我有一个 plist,其中包含定义配置屏幕的字典层次结构。这些是可变的并且在整个应用程序中保持不变。由于最初的讨论似乎集中在改变字典引起的问题上,我必须要求确认:字典的顺序是否保证与 plist 中的顺序相同,即读取时(使用 initWithContentsOfFile)?如果字典永远不会改变,我可以在这种情况下使用 allKeys 来获取正确顺序的键数组吗?

【问题讨论】:

【参考方案1】:

不,密钥的出现顺序可能与您的 plist 文件的顺序不同。我无法查看引擎盖下的内容,但我猜想这些键是以提供有效查找的任何方式排序的。 allKeys 的文档说未定义数组中元素的顺序。

【讨论】:

我的应用确实以与 plist 相同的顺序显示它们,这是我开始怀疑的原因之一。但我现在知道它是未定义的。 在我的应用程序中,它们并不总是以与 plist 相同的顺序显示 - 取决于当时正在读取的 plist。【参考方案2】:

如果您需要维持秩序的NSDictionary,请查看CHDataStructure's CHOrderedDictionary,它正是这样做的。我一直在使用它。

【讨论】:

我在 iPhone 上需要它,所以 Cocoa Touch。我想知道它是否在上面运行?无论如何,我会回答我自己的问题:不,显然不能期望 NSDictionary 有任何顺序。所以,我正在做我看到其他人建议的事情:包含一个带有顺序和键“_order”的数组。人们一直在说这种笨拙的双重数据保存在他们看来一点也不笨拙。不过还是很笨重。 是的,CHDataStructures 可以在 Mac 和 iPhone 上运行。【参考方案3】:

我不会假设密钥会按任何顺序排列,因为allKeys 不保证顺序。

在内部,NSDictionary uses a hash table。

来自allKeys description:

数组中元素的顺序 没有定义。

如果您想按某种顺序显示值,则获取键,对键数组进行排序,然后获取每个键的值。

【讨论】:

【参考方案4】:

什么都没有保证顺序。甚至不能保证对字典进行两次迭代会以相同的顺序为您提供键。

【讨论】:

以上是关于如果 NSDictionary 键顺序从不改变,它是不是保证与初始化相同?的主要内容,如果未能解决你的问题,请参考以下文章

避免在 NSDictionary 中排序

NSDictionary 按字母顺序排序[重复]

按字母顺序对 NSDictionary 值进行排序

如何获得 NSDictionary/NSMutableDictionary 的原始顺序?

如何将图像从不规则矩形更改为矩形?

从 OrderDictionary 获取有序键