我如何获得NSDictionary / NSMutableDictionary的原始订单?

时间:2010-08-02 10:36:50

标签: iphone nsmutablearray nsdictionary nsmutabledictionary

我创建了带有10个密钥的NSMutableDictionary。现在我想以与添加到NSMutableDictionary相同的顺序访问NSMutableDictionary密钥(使用SetValue:* forKey:*);

我如何实现这一目标?

5 个答案:

答案 0 :(得分:9)

如果绝对必须使用字典容器,则必须使用可按添加键值对的顺序排序的键。因此,在创建字典时,使用自动递增整数或类似的键。然后,您可以对(整数)键进行排序,并检索与这些键关联的值。

但是,如果您执行所有这些操作,您也可以使用NSMutableArray并直接向数组添加值!它会更快,并且需要更少的代码。您只需按顺序检索对象:

for (id obj in myArray) { /* do stuff with obj... */ }

答案 1 :(得分:7)

NSMutableDictionary无法做到这一点。看看例如Matt Gallaghers OrderedDictionary

答案 2 :(得分:2)

我编写了一个快速方法来获取源数组(对象全部乱序)和一个引用数组(具有所需(和完全任意)顺序的对象),并返回一个数组所在的数组已重新组织源数组以匹配引用数组。

- (NSArray *) reorderArray:(NSArray *)sourceArray toArray:(NSArray *)referenceArray
{
    NSMutableArray *returnArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < [referenceArray count]; i++)
    {
        if ([sourceArray containsObject:[referenceArray objectAtIndex:i]])
        {
            [returnArray addObject:[arrReference objectAtIndex:i]];
        }
    }
    return [returnArray copy];
}

请注意,这非常脆弱。它使用NSArray的{​​{1}}方法,最终将调用NSObject's isEqual:。基本上,它应该适用于containsObject: s,NSString s和NSNumber s(尚未尝试过那个)的数组,但除此之外,YMMV。我想如果你试图传递NSDate s或其他一些非常复杂的对象的数组,那么它本身就会完全失败,并且会崩溃或返回总垃圾。同样,如果您要执行诸如传递UITableViewCell s数组作为参考数组和NSDate s数组作为源数组。此外,如果源数组包含引用数组中未涵盖的项,则它们将被丢弃。可以通过添加一些额外的代码来解决其中一些问题。

所有这一切,如果你想做一些简单的事情,它应该很好地工作。在您的情况下,您可以在循环浏览NSString时建立参考数组。

setValue:forKey:

然后,当你想按照他们进入的顺序循环你的项目时,你只需

NSMutableArray *referenceArray = [[NSMutableArray alloc] init];
NSMutableDictionary *yourDictionary = [[ NSMutableDictionary alloc] init];

for (//whatever you are looping through here)
{

    [yourDictionary setValue://whatever forKey:key];
    [referenceArray addObject:key];

}

答案 3 :(得分:0)

实际上你有一个参考数组按顺序排列,然后为什么你要添加一个数组。所以我觉得这种方法不好。请考虑我的意见。

答案 4 :(得分:0)

尽管@GenralMike的回答变得轻而易举,但可以通过以下方式排除不必要的代码来优化它:

1)保持一个数组,按照添加顺序保存对字典键的引用。

NSMutableArray *referenceArray = [[NSMutableArray alloc] init];
NSMutableDictionary *yourDictionary = [[ NSMutableDictionary alloc] init];

for (id object in someArray) {

     [yourDictionary setObject:object forKey:someKey];
     [referenceArray addObject:someKey]; // add key to reference array

}

2)现在“referenceArray”按顺序保存所有键,因此您可以按照与最初添加到字典中相同的顺序从字典中检索对象。

for (NSString *key in referenceArray){
    //get object from dictionary in order
    id object = [yourDictionary objectForKey:key];
}