10

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

我怎样才能做到这一点?

4

5 回答 5

9

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

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

for (id obj in myArray) { /* do stuff with obj... */ }
于 2010-08-02T10:42:54.663 回答
7

NSMutableDictionary不能那样做。看看例如 Matt Gallaghers OrderedDictionary

于 2010-08-02T10:41:02.813 回答
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'containsObject:方法,最终将调用NSObject'sisEqual:。基本上,它应该适用于NSStrings、NSNumbers 和可能NSDates 的数组(还没有尝试过),但除此之外,YMMV。我想如果你试图传递UITableViewCells 的数组或其他一些非常复杂的对象,它会完全 sh*t 本身,要么崩溃,要么返回全部垃圾。同样,如果您要执行类似传递NSDates 数组作为参考数组和NSStrings 数组作为源数组的操作。此外,如果源数组包含参考数组中未涵盖的项目,它们将被丢弃。可以通过添加一些额外的代码来解决其中一些问题。

综上所述,如果您尝试做一些简单的事情,它应该可以很好地工作。在您的情况下,您可以在循环遍历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];

}

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

for (NSString *key in [self reorderArray:[myDict allKeys] toArray:referenceArray])
于 2013-12-17T20:38:44.403 回答
0

实际上,您有一个有序的参考数组,那么为什么还要添加一个数组。所以我想这种方法不好。请考虑我的意见。

于 2014-07-25T11:10:20.287 回答
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];
}
于 2015-10-04T06:58:57.557 回答