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

fal*_*ter 12 dictionary objective-c

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

for ( k in dictionary ){
   // output the k - value
}
Run Code Online (Sandbox Code Playgroud)

它会以相同的顺序显示?

Dav*_*ong 21

不,NSDictionary不保持其键的插入顺序.

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

一个字典,按照插入顺序枚举键.

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

-firstKey

-lastKey

-keyAtIndex:

-reverseKeyEnumerator

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


NSR*_*der 12

NSDictionary的键不是按顺序保存的,但你可以得到它们并对它们进行排序,E.G:

for (key in [[myDict allKeys] sortedArrayUsingSelector:@selector(compare:)])
...
Run Code Online (Sandbox Code Playgroud)

  • @arlomedia不,for循环首先计算集合表达式,然后迭代结果.因此,在此示例中,排序仅发生一次. (2认同)

Lor*_*olt 5

我想添加一些内容,以防有人正在搜索此内容并偶然发现此线程:

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

NSString *key = [arrayOfKeys objectAtIndex:0];
NSString *stringAtIndexZero = [unorderedDictionary objectForKey:key];
Run Code Online (Sandbox Code Playgroud)