我知道对 NSDictionary 进行排序的正确方法是从键创建一个数组,对数组进行排序,然后枚举数组并从那里对 NSDictionary 进行操作。我的问题是,对于具有字符串键和值的 NSDictionary *dict,
为什么这是按字母顺序排列的:
NSLog(@"%@", dict);
但这不是:
for (NSString *w in dict)
{
NSLog(@"%@", w);
}
看起来很奇怪......我做错了什么吗?
提前致谢。
我知道对 NSDictionary 进行排序的正确方法是从键创建一个数组,对数组进行排序,然后枚举数组并从那里对 NSDictionary 进行操作。我的问题是,对于具有字符串键和值的 NSDictionary *dict,
为什么这是按字母顺序排列的:
NSLog(@"%@", dict);
但这不是:
for (NSString *w in dict)
{
NSLog(@"%@", w);
}
看起来很奇怪......我做错了什么吗?
提前致谢。
那不是“在内存中”—— %@ 导致在 dict 上调用一条消息,并对其进行排序。枚举旨在为您提供对内容的最快、原始访问。如果需要对其进行排序,则必须对其进行排序。
看看这个免费的 Objective-C 排序字典
因为第一个完全按照您描述的方式对数组进行排序,以使用户/程序员更容易找到东西。但是,如果您使用较低级别的CFCopyDescription(dict)
.
CoreFoundation 集合的源代码是可用的,尽管没有 Objective-C 接口。NSDictionary
/CFDictionary
和NSSet
/CFSet
是基于CFBasicHash
,不出所料地实现了一个哈希表。并以内存顺序(和CFBasicHash.m)CFCopyDescription()
对元素进行快速迭代循环。实际排序是为基于散列的快速查找而设计的。如果您不熟悉哈希表,请参阅Wikipedia。CFBasicHashApply()
CFBasicHashGetBucket()