Objective-C字典是有序容器吗?

时间:2009-10-30 04:51:07

标签: objective-c dictionary

作为标题,当我将元素插入到objective-c中的字典(按顺序如:k1,k2,k3)时,是否有任何保证,当我枚举它时:

for ( k in dictionary ){
   // output the k - value
}

会以相同的顺序显示吗?

5 个答案:

答案 0 :(得分:21)

不,NSDictionary不维护其密钥的插入顺序。

如果你需要一个维护插入顺序的字典,我建议使用CHDataStructures framework,它有一个CHOrderedDictionary类(它是NSMutableDictionary的后代)。 CHOrderedDictionary的文档说:

  

按照插入顺序枚举键的字典。

     

提供以下附加操作以利用订购:

     

-firstKey

     

-lastKey

     

-keyAtIndex:

     

-reverseKeyEnumerator

     

键入值条目就像在普通字典中一样插入,包括替换现有键的值,详见-setObject:forKey:。但是,并行使用附加结构来跟踪插入顺序,并且按顺序枚举键。如果要添加的键当前不存在于字典中,则会将其添加到列表的末尾,否则键的插入顺序不会更改。

答案 1 :(得分:12)

NSDictionary的密钥不是按顺序排列的,但你可以得到它们并对它们进行排序,E。G:

for (key in [[myDict allKeys] sortedArrayUsingSelector:@selector(compare:)])
...

答案 2 :(得分:4)

不,它没有订购。如果需要,您可以使用一系列键来记住订单,但字典是概念上无序的键值对。

答案 3 :(得分:4)

我想添加一些内容,以防有人搜索此内容并偶然发现此主题:

对于有序的词典有一个相当简单的解决方法,那就是有一个数组,它包含你想要的顺序的键。然后有一个无序字典,但你可以使用数组中的键按顺序访问每个键:

NSString *key = [arrayOfKeys objectAtIndex:0];
NSString *stringAtIndexZero = [unorderedDictionary objectForKey:key];

答案 4 :(得分:0)