2011-12-02 72 views
0

我有一些关于NSMutableDictionary的问题。我读过它们只是散列表的一个包装,所以不鼓励它们用于有序列表。NSMutableDictionary,与控制台和代码不同的打印

但我不得不使用它,这样的问题开始......

我救一个JSON的结果(到URL中的呼叫后)在的NSMutableDictionary,然后我有两个不同的“打印”:

  • ,如果我尝试打印字典从命令“宝myDictionary”控制台我有一个顺序在每一个要素(原JSON的顺序)
  • 如果我创建一个简单的“的声明”和打印myDictionary,我有不同的顺序。

这怎么可能?他们不应该有相同的顺序吗?

谢谢大家!

编辑:这是代码的一个小例子:

NSMutableDictionary *myDictionary = [--{RECEIVED FROM ANOTHER CALL}--]; 
NSMutableDictionary *tmp = [NSMutableDictionary dictionaryWithCapacity:[myDictionary count]]; 

for(NSString *key in myDictionary) { 
    NSLog(@"%@", key); 

    NSObject *object = [[NSObject alloc] init] 

    /* some operation in the code with object */ 

    [tmp setObject:object forKey:key]; 
} 

经过了“声明”,这是发生了什么事:

  • ,如果我看到所有的日志,我收到东西(对例如,如果myDictionary的名称为“星期六,星期一,星期五......”的日期的名称)
  • 如果我在此处插入断点并尝试使用命令“po myDictionary”从控制台打印某些内容,我有另一个命令,(“周日,周二,星期一,...“)

问题是:为什么?

编辑2:我知道存在一个系统有一个“OrderedDictionary”,但它不是一个问题:我想知道为什么我有两个从“for语句”不同的打印,一个和另一个来自“po命令”。

+0

你能展示什么正在打印?你是如何调用印刷品的? –

+0

不鼓励使用它们用于有序列表,因为它们不保证特定的顺序。 –

+0

@Terry:是的,我知道他们的使用ID不鼓励,但这不是问题。 –

回答

5

gdb中的po <object>命令输出[<object> description]的输出。 [NSDictionary description]按键排序其输出。这是documented behavior

如果您的JSON按键排序(它听起来像是这样),那么您可以再次按键排序以确保可靠的顺序。

请注意,如果您的JSON正在使用一个对象(一组键/值对)来表示有序数据,则它违反了JSON spec

一个目的是无序集合的零个或多个名称/值对,其中一个名称是字符串,一个值是一个字符串,数字,布尔值,null,对象或数组。

正确的编码是单关键对象,如数组:

[ { "firstKey": "value" }, { "secondKey": "value" } ] 

但是如果你可以使用排序键来定义命令,这是适当的。

+0

非常感谢,这正是我想知道的:PO print [ description]。 谢谢! –

1

你可能更喜欢一个有序字典:http://cocoawithlove.com/2008/12/ordereddictionary-subclassing-cocoa.html

好了,现在你已经修改了原来的问题。你现在问:

我知道存在一个系统有一个“OrderedDictionary”,但它不是问题:我想了解为什么我有两个不同的打印,一个来自“for声明“,另一个来自”po命令“。

这是因为它们是访问数据的两种完全不同的方式。 for语句按照某种顺序逐一排列键。 po命令调用字典的description方法,该方法显然不包含枚举类似于您的键的for语句。我不明白你为什么觉得这很令人费解。

+0

我知道这一点,但我不能使用:我收到词典“为它”,我不能修改我创建它的方式...如果我试图循环通过我的字典它已经无序。 –

+0

是的,但是您从原始字典中创建了有序字典,现在您有一个指向完全相同数据的有序字典。因此,按照一致的顺序来执行数据。或者做Rob建议并枚举排序后的键来遍历数据。你不清楚为什么这些不是很好的解决方案。 – matt

+0

是的,我修改了一些原文,因为在二读之后,我不得不承认这个问题是错误的。感谢您的帮助 –

2

NS(可变)字典没有排序,句点。 (这并不是不鼓励)。即使您获得了po提供的“原始订单”,也不能保证它会保持从应用程序启动到应用程序启动,或从操作系统版本到操作系统版本,或从硬件到硬件的这种方式。不要这样做。

也许你想使用类似http://cocoawithlove.com/2008/12/ordereddictionary-subclassing-cocoa.html

+0

谢谢,但我不能使用它...我收到字典“为它”。 –

+1

@MarcoPace我不喜欢这样说,但是在那种情况下,除了抱怨谁在给你词典 - 没有人应该给你一本词典,然后期望你能够阅读订单的。在你的情况下,听起来好像是与你交谈的API提供者。 –

+0

感谢您的帮助,我认为最好的办法是更改我得到的数据 –