【发布时间】:2010-11-20 16:40:49
【问题描述】:
我的意思是:NSDictionary 中键和值的顺序是否总是与初始化 NSDictionary 时指定的顺序相同?或者如果我真的需要知道键的顺序,我应该更好地维护一个单独的 NSArray?
【问题讨论】:
标签: iphone cocoa-touch uikit nsdictionary
我的意思是:NSDictionary 中键和值的顺序是否总是与初始化 NSDictionary 时指定的顺序相同?或者如果我真的需要知道键的顺序,我应该更好地维护一个单独的 NSArray?
【问题讨论】:
标签: iphone cocoa-touch uikit nsdictionary
不,它们没有被订购。只要您不从字典中添加或删除任何元素,它们将保持相同的顺序,但一旦您添加或删除一个元素,新的顺序将完全不同。
如果您需要对键/值进行排序,请改用 NSArray(或其他一些有序数据结构)。
【讨论】:
NSDictionary 文档中没有任何地方对订单做出任何承诺或保证——它只是说它为管理键和值的不可变关联的对象提供了“编程接口” . -allKeys 和 -allValues 消息的文档确实指出这些方法返回的顺序未定义,尽管对于枚举字典元素的其他方式更明确地说明这一点可能不是一个坏主意.
NSDictionary 键和值没有排序。您的选择:
【讨论】:
Matt Gallagher 写了一篇名为 “OrderedDictionary: Subclassing a Cocoa class cluster” 的博文,正好涵盖了这个问题,并附有示例代码。
【讨论】:
根据Apple's reference,NSDictionary 基本上是一个散列表的包装器。所以不,不能保证它们按任何特定顺序排列。
【讨论】:
在访问 NSDictionary 时,永远不能保证键的顺序相同。如果可以比较键(我假设它们可以给出你的问题),那么如果你需要按排序顺序访问它们,你总是可以对它们进行排序。
您需要首先将键读入一个数组,然后对数组进行排序。
【讨论】:
事实上,即使是完全相同的程序和完全相同的操作系统版本,在两个不同的设备上运行程序时,您甚至不能依赖于顺序相同。
例如,如果您在 iPad Air 上运行程序,则 NSDictionary 中元素的顺序可能与在 iPad Retina 上运行相同程序时不同,即使 iOS 版本完全相同。
简而言之,绝不能依赖 NSDictionary 中元素的顺序。您必须始终假设它们可能以任何未指定的顺序排列,在不同的设备上可能会有所不同。
【讨论】: