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

12

就像标题所述,在Objective-C中将元素插入字典时(按顺序:k1,k2,k3),是否保证在枚举时:

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

它会以相同的顺序显示吗?

5个回答

21
不,NSDictionary 不会维护其键的插入顺序。 如果您需要一个保持插入顺序的字典,建议使用CHDataStructures框架,它具有CHOrderedDictionary类(它是NSMutableDictionary的后代)。关于CHOrderedDictionary的文档如下:

一个以插入顺序枚举键的字典。

以下附加操作可利用排序:

-firstKey

-lastKey

-keyAtIndex:

-reverseKeyEnumerator

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


12

NSDictionary的键没有保持顺序,但您可以获取它们并对它们进行排序,例如:

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

1
快速简便,谢谢。但是应用程序每次迭代循环时都必须执行排序操作吗?如果是这样,我会先进行一次排序并将结果放入变量中,然后对变量进行迭代。 - arlomedia
2
@arlomedia 不,for循环首先计算集合表达式,然后迭代结果。因此,在此示例中只发生一次排序。 - Rik Smith-Unna
1
问题要求有序(按插入顺序),而不是排序。 - user102008
虽然它不按插入顺序提供,但它提供了索引顺序。无论如何,解决了我的问题。 - Abdul Jamil

5

如果有人搜索并遇到这个主题,我想补充一些内容:

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

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

4
不,它不是有序的。如果需要,您可以使用键数组来记住顺序,但字典在概念上是无序的键值对袋子。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接