在迭代 NSDictionary 时保持顺序

Posted

技术标签:

【中文标题】在迭代 NSDictionary 时保持顺序【英文标题】:Maintaining the order while iterating a NSDictionary 【发布时间】:2016-04-27 07:20:05 【问题描述】:

我有一个 NSDictionary,它正在迭代并将数据保存到核心数据,如下所示,

NSDictionary *details = [valueDict objectForKey:@"shipment_master"];

             for (NSDictionary *response in details) 
                 NSManagedObjectContext *context = [self managedObjectContext];

                 // remove all rows

                 [context performBlockAndWait:^
                     // add new row(s)
                     NSManagedObject *master = [NSEntityDescription insertNewObjectForEntityForName:@"ShipmentMaster" inManagedObjectContext:context];
                     NSError *error;

                     [master setValue:[details objectForKey:response] forKey:@"values"];

                     // save MOC
                     if ([context hasChanges]) 
                         (void)[context save:&error];
                     
                 ];
             

问题是在循环 nsdictionary 时更改了顺序。例如 a 出现在 b 然后 c , d 等在字典中,但是当我迭代它并保存它时,顺序正在改变,我怎样才能保持顺序?

【问题讨论】:

字典中没有顺序...你需要元组数组 你能参考我的代码解释一下吗?谢谢 NSDictionary with ordered keys的可能重复 NSDictionary 将其键存储在哈希表中,该哈希表在设计上是无序的。这种缺乏顺序是哈希表存储的基础,所以是的。 【参考方案1】:

NSMutableDictionary 未排序。您无法保证键的顺序,因为NSDictionary 不会尝试保留任何特定的顺序。要以特定顺序遍历字典,您必须按照您想要的顺序创建一个 NSArray 键,然后对其进行迭代并获取相应的值。

【讨论】:

【参考方案2】:

NSDictionary 是一个无序的集合。说“我添加它们的顺序”没有任何意义。如果您想按特定顺序访问键,那么您要么必须在字典旁边存储一个数组,要么获取键然后对它们进行排序并使用它来按该顺序访问值。

【讨论】:

【参考方案3】:

NSMutableDictionary 中没有顺序如果你想使用它,你可以通过将键存储到 NSArray 中来使用它,然后迭代它并获取你想要使用的相关值。希望它对你有用:)

【讨论】:

以上是关于在迭代 NSDictionary 时保持顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NSMutableArray 中迭代时删除 NSDictionary [重复]

转NSDictionary以及NSMutableDictionary的用法

Python实用技法第6篇:让字典保持有序

在 C++ 中删除向量中的第一个最小数字(并保持顺序)

我想用 URL POST 方法在字典参数中传递数组

NSDictionary 按字母顺序排序[重复]