2011-12-02 67 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

感謝您的幫助,我認爲最好的辦法是更改我得到的數據 –