我怎样才能获得的NSDictionary /的NSMutableDictionary的原始订单?我怎

2019-05-12 08:18发布

我已经建立的NSMutableDictionary用10 keys.Now我想要访问在同一顺序的NSMutableDictionary密钥,因为它被添加到的NSMutableDictionary(使用的SetValue:* forKey:*);

我怎样才能做到这一点?

Answer 1:

如果你绝对必须使用字典的容器,你必须使用一个密钥是在其中添加键值对的顺序排序。 因此,在创建字典时,您可以使用一键即自动递增的整数或相似。 然后,您可以排序(整数)键和检索与这些键关联的值。

如果你做了这一切,但是,你可能也只是使用NSMutableArray ,并添加值直接在阵! 这将是更快,需要更少的代码。 你只是为了取回对象:

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


Answer 2:

NSMutableDictionary不能做到这一点。 看看如马特加拉格尔斯OrderedDictionary



Answer 3:

我写了一个快速的方法采取源阵列(即都是无序对象的)和参考阵列(其具有在期望的(和完全任意的)顺序的对象),并返回一个阵列,其中源阵列的项已被重新组织,以将参考阵列相匹配。

- (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];
}

请注意,这是很脆弱的。 它使用NSArraycontainsObject:方法,它最终将调用NSObjectisEqual: 。 基本上,它应该对数组工作带来极大NSString S, NSNumber S,也许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];

}

然后,当你要循环的顺序您的项目,他们进来的时候,你只

for (NSString *key in [self reorderArray:[myDict allKeys] toArray:referenceArray])


Answer 4:

其实你有才能的方式引用数组,那么你为什么要添加到一个更array.So我想这种做法是不是good.Please考虑我的意见。



Answer 5:

虽然@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];
}


文章来源: How can i get Original order of NSDictionary/NSMutableDictionary?