我想以元素存储在其中的方式访问字典。有人可以帮我这么做吗?在此先感谢!!
答案 0 :(得分:3)
字典将其值存储在由键索引的结构中,或者更确切地说,由键的哈希值存储。这就是他们快速的原因。他们不需要搜索值,只需获取键的has值并直接获取值(在大多数情况下,只有在碰撞键值哈希值时才需要搜索)。
因此保存值的顺序是不可预测的。如果您需要订单,则需要数组或链接列表 - 两种结构都有一个定义的顺序,其中存储了值。
如果你需要两者:字典类型访问和保存顺序,你必须寻找一个带有列表支持字典的可能开源库或者你自己的版本:采用字典界面并实现它以便保存它在列表和内部字典中同时。
访问器方法将转到字典,但您可以提供列表的迭代器并按添加顺序返回数据。
答案 1 :(得分:1)
Cocoa中没有Ordered Dictionary。最好的办法是创建一个自定义类,它包装字典并在输入时保留一系列键。这不是太难。你的班级可以很好地“覆盖”NSMutableDictionary
的方法,如下所示:
// innerDict is an NSMutableDictionary
// keyArray is an NSMutableArray
- (void)setObject:(id <NSCopying>)anObject forKey:(id)aKey {
[innerDict setObject:anObject forKey:aKey];
// Keys are added to the array in the order they go into the dictionary;
// users of the class can access the array to get this info
[keyArray addObject:aKey];
}
- (id)objectForKey:(id)aKey {
return [innerDict objectForKey:aKey];
}
- (void)removeObjectForKey:(id)aKey {
[innerDict removeObjectForKey:aKey];
[keyArray removeObject:aKey];
}
- (NSEnumerator *)keyEnumerator {
// It's actually better for users of this class to
// use fast enumeration on the keyArray; this is just an example
return [keyArray objectEnumerator];
}
如果你弄脏了,Matt Gallagher有一个tutorial on collection subclassing,恰好使用Ordered Dictionary作为例子。