2010-11-19 36 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

相关问题