停止 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 键排序为 NSDate

按 NSDictionary 值对 NSArray 进行排序

在 Swift 中对 NSDictionary 对象的 NSArray 进行排序

使用值对 NSDictionary 的 NSArray 进行排序

使用 NSDictionary 对 NSArray 进行排序

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