停止 NSDictionary 对其项目进行排序
Posted
技术标签:
【中文标题】停止 NSDictionary 对其项目进行排序【英文标题】:Stop NSDictionary from sorting its items 【发布时间】:2012-03-21 01:54:55 【问题描述】:我有这个代码
NSDictionary *tempDict = [NSDictionary dictionaryWithObjects:
[NSArray arrayWithObjects:@"authorId","authorName","authorDescription",@"image",nil] forKeys:
[NSArray arrayWithObjects:@"id",@"name",@"desc",@"image",nil]];
NSLog(@"%@",[tempDict description]);
输出是
desc = authorDescription;
id = authorId;
image = image;
name = authorName;
您看到,出于某种原因,字典按字母顺序按键排序。这对我不利,因为我需要将此字典添加到 plist 中,而此 plist 已经有一些带有未排序键的字典。那么如何避免这种排序呢?
【问题讨论】:
【参考方案1】:排序是由于[NSDictionary description]
,由NSLog
使用。这不是NSDictionary
的基本特征。如果您通过快速枚举或[dictionary allKeys]
访问密钥,您将不会发现它已排序。
但是对于您的基本问题,如果您想要的是“未排序”(随机),那么“排序”只是可能的随机序列之一。如果您真的想要未排序,那么排序应该无关紧要,因为它是一个子集。
如果排序很重要,那么您的意思不是“未排序”,您的意思是“其他排序顺序,例如插入顺序”。如果您需要以某种方式对 NSDictionary
进行排序,则需要通过将其转换为 NSArray
来强制执行此操作。
【讨论】:
我正在使用[dataDict allKeys]
,但我的密钥仍然随机排列。
@upendra 我不明白这个问题。 allKeys
没有订单承诺。【参考方案2】:
它没有排序。它以任意顺序显示。添加更多项目,您可能会看到订单发生变化。
(有可能在内部,出于某种疯狂的原因,存储实际上已排序,但您对此无能为力。)
【讨论】:
好的,我在 plist 中写这个字典,打开 plist 和这个字典在 plist 中按键排序(或以任意顺序 - 没关系)。这对我来说是不可接受的 正如 lulius 所说,NSDictionary 没有对其内容进行排序。 NSDictionary 基本上是一个哈希表。你看到的排序只是它的打印结果。如果您将tempDict
添加到另一个字典,则会添加对象/键对,并且它们将不按特定顺序存储(即 NSDictionary 的内部结构)。或者,您可以尝试 NSLogging 使用您的 plist 初始化的其他 NSDictionary,即使其数据未排序,其打印输出结果也排序正确?以上是关于停止 NSDictionary 对其项目进行排序的主要内容,如果未能解决你的问题,请参考以下文章
按 NSDictionary 值对 NSArray 进行排序
在 Swift 中对 NSDictionary 对象的 NSArray 进行排序
使用值对 NSDictionary 的 NSArray 进行排序