如何顺序访问字典?

时间:2011-05-02 07:30:06

标签: iphone objective-c

我想以元素存储在其中的方式访问字典。有人可以帮我这么做吗?在此先感谢!!

2 个答案:

答案 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作为例子。