保持NSMutableDictionary对象的特定顺序

时间:2014-10-14 10:43:35

标签: ios objective-c nsdictionary

我正在尝试编写一个方法,允许我在将NSMutableDictionary密钥插入数据结构时保持其顺序。我知道哈希映射的NSMutableDictionary工作,因此没有维持特定的顺序。

所以我需要以某种方式跟踪插入到字典中的键,并且当从字典中检索值时,将按照与最初插入时相同的顺序打印键(键值)。插入字典中的键是字母数字。它们只需按照插入NSMutableDictionary时的相同顺序打印出来。

这可以实现吗?我想继续使用NSDictionary数据结构。

2 个答案:

答案 0 :(得分:3)

NSDictionary(以及它的所有关系)都是无序的集合,所以“保持其顺序”是没有意义的,因为没有顺序。

如果您想要按特定顺序检索对象,则需要使用NSArray。 (或NSOrderedSet如果哈希的唯一性很重要。)

简单而天真的选择

如果您有字典结构......

{
    key1:value1,
    key2:value2,
    key3:value3,
    //and so on
}

然后你可能会更好地使用......

[
    {
        key1:value1
    },
    {
        key2:value2
    },
    {
        key3:value3
    }
]
// i.e. an array of dictionaries

更多代码,但更好的选择

或者您可以创建一个新的集合类作为NSObject的子类。

在课堂上你可以有类似......

- (void)addObject:(id)object forKey:(id)key
{
    self.dictionary[key] = object;
    [self.array addObject:key];
}

和...

- (id)objectForKey:(key
{
    return self.dictionary[key];
}

和...

- (id)objectAtIndex:(NSUInteger)index
{
    return self.dictionary[self.array[index]];
}

甚至......

- (void)removeObjectForKey:(id)key
{
    [self.dictionary removeObjectForKey:key];
    [self.array removeObject:key];
}

你甚至可以使它符合快速枚举,这样你就可以......

for (id object in mySuperSpecialCollection) {

}

并按照数组的顺序分配对象。

答案 1 :(得分:2)

  

这可以实现吗?我想继续使用NSDictionary数据结构。

没有。使用NSDictionary的实例时,实际的类是私有的。与类集群一样,它不可能继承NSDictionary并使用派生功能(存储键值对)。

最好的方法是设置自己的数据结构,可以结合使用NSOrderedSetNSDictionary