如何获得 NSDictionary/NSMutableDictionary 的原始顺序?

Posted

技术标签:

【中文标题】如何获得 NSDictionary/NSMutableDictionary 的原始顺序?【英文标题】:How can i get Original order of NSDictionary/NSMutableDictionary? 【发布时间】:2010-08-02 10:36:49 【问题描述】:

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

我怎样才能做到这一点?

【问题讨论】:

键不是固定的,它们是动态的。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

NSMutableDictionary 不能这样做。看看例如马特·加拉格斯OrderedDictionary.

【讨论】:

但是你能告诉我如何使用这个类吗?【参考方案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: 方法,最终将调用NSObject's isEqual:。基本上,它应该适用于NSStrings、NSNumbers 和NSDates 的数组(还没有尝试过),但除此之外,YMMV。我想如果你试图传递UITableViewCells 或其他一些非常复杂的对象的数组,它会完全自我毁灭,要么崩溃,要么返回全部垃圾。同样,如果您要执行类似将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])

【讨论】:

这实际上是一个相当不错的解决方案。谢谢 无需在上面的答案中使用第一段代码。一旦像上面在referenceArray中设置键一样设置了参考数组中的键,您就不再需要弄乱“源引用”数组方法(上面的第一种方法),因为数组保存“ORDER”中的值”。您可以简单地遍历referenceArray并从“yourDictionary”中获取对象,就像“Ganesh”在下面的帖子中指出的那样: for (NSString *key in referenceArray) //get object from dictionary id object = [yourDictionary objectForKey :钥匙]; 【参考方案4】:

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

【讨论】:

【参考方案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];

【讨论】:

以上是关于如何获得 NSDictionary/NSMutableDictionary 的原始顺序?的主要内容,如果未能解决你的问题,请参考以下文章

求教,如何获得comboBox中当前选择的值

如何获得物体度数?

如何在一行上获得 3d 瓷砖并在悬停时获得缩放效果?

PHP如何获得POST传来的值?

CSDN如何获取C币

SQl中如何获得时间的时,分,秒部分?