如果 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 键顺序从不改变,它是不是保证与初始化相同?的主要内容,如果未能解决你的问题,请参考以下文章