2010-11-19 37 views
4

我知道排序NSDictionary的正確方法是從鍵創建一個數組,對數組進行排序,然後枚舉整個數組,然後從那裏操作NSDictionary。我的問題是,對於一個NSDictionary *字典,用鑰匙和字符串的值,爲什麼NSDictionary在內存中是按字母順序排列的,但不是在枚舉中?

這是爲什麼字母:

NSLog(@"%@", dict); 

但是,這並不:

for (NSString *w in dict) 
{ 
    NSLog(@"%@", w); 
} 

似乎很奇怪...難道我做錯了什麼?

在此先感謝。

回答

6

這不是「在內存中」 - %@導致在dict上調用消息,並對其進行排序。枚舉意味着給你最快,最原始的內容訪問。如果你需要排序,你必須對其進行排序。

看看這個免費的分類字典的Objective-C

http://code.google.com/p/cocoa-sorted-dictionary/

+0

啊,這是有道理的。我沒有想到NSLog的%@正在進行排序。謝謝! – iBuys 2010-11-20 16:22:04

+0

I.e.法官本質上是無序的。 – bbum 2010-11-21 20:37:48

+0

字典只是一個將一個值映射到另一個值的集合的接口。它不一定是無序的。例如,我可以從二叉樹中創建一個字典 - 在這種情況下,它將被排序。在C++中,std :: map有一個字典界面,並且是有序的。哈希表是無序的,所以用一個哈希表構成的字典也是。 – 2010-11-21 21:05:56

2

因爲第一個排在正是你描述的方式排列,以方便用戶/程序員找到東東。但是,如果您使用較低級別的CFCopyDescription(dict),則會獲得迭代順序。

CoreFoundation集合的源代碼是available,儘管沒有Objective-C接口。 NSDictionary/CFDictionaryNSSet/CFSet基於CFBasicHash,這不意外地實現了散列表。 CFCopyDescription()和內存順序中的元素快速迭代循環(CFBasicHash.m中的CFBasicHashApply()CFBasicHashGetBucket())。實際的排序是爲基於散列的快速查找而設計的。如果您不熟悉哈希表,請參閱Wikipedia

+0

這也是一個很好的解釋,謝謝你的深入信息。 – iBuys 2010-11-20 16:23:39

相關問題