为什么NSDictionary在内存中按字母顺序排列,但在枚举中不是?

时间:2010-11-19 19:34:44

标签: cocoa sorting nsdictionary alphabetical

我理解对NSDictionary进行排序的正确方法是从键创建一个数组,对数组进行排序,然后枚举数组并从那里对NSDictionary进行操作。我的问题是,对于NSDictionary * dict,使用键和键值,

为什么这是按字母顺序排列的:

NSLog(@"%@", dict);

但这不是:

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

看起来很奇怪......我做错了什么?

提前致谢。

2 个答案:

答案 0 :(得分:6)

那不是“在内存中” - %@导致在dict上调用一条消息,并对其进行排序。枚举旨在为您提供对内容的最快,原始访问。如果您需要对它进行排序,则必须对其进行排序。

看一下Objective-C

的免费排序字典

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

答案 1 :(得分:2)

因为第一个按照您描述的方式对数组进行排序,以便用户/程序员更容易找到内容。但是,如果您使用较低级别CFCopyDescription(dict),则会获得迭代顺序。

CoreFoundation集合的源代码是available,尽管没有Objective-C接口。 NSDictionary / CFDictionaryNSSet / CFSet基于CFBasicHash,毫不奇怪地实现了哈希表。 CFCopyDescription()和快速迭代循环遍历内存顺序中的元素(CFBasicHash.m中的CFBasicHashApply()CFBasicHashGetBucket())。实际排序是为基于散列的快速查找而设计的。如果您不熟悉哈希表,请参阅Wikipedia