【问题标题】:How to reorder NSMutableDictionary to a NSMutableArray?如何将 NSMutableDictionary 重新排序为 NSMutableArray?
【发布时间】:2012-09-07 19:02:21
【问题描述】:

我有一个包含NSURLConnection 描述的NSMutableArray,如下所示:

array {

    "<NSURLConnection: 0x60eb40>",
    "<NSURLConnection: 0x6030e0>",
    "<NSURLConnection: 0x602ce0>",
    "<NSURLConnection: 0x60c330>",
    "<NSURLConnection: 0x662f5a0>",
}

我还有一个NSMutableDictionary,其键是上述NSMutableArray 中的项目,如下所示:

dictionary {

"<NSURLConnection: 0x602ce0>"  = "Last update: Sep 3, 2012";
"<NSURLConnection: 0x6030e0>"  = "Last update: Sep 7, 2012";
"<NSURLConnection: 0x60c330>"  = "Last update: Sep 4, 2012";
"<NSURLConnection: 0x60eb40>"  = "Last update: Sep 6, 2012";
"<NSURLConnection: 0x662f5a0>" = "Last update: Sep 5, 2012";

}

我需要重新排序 NSMutableDictionary 以匹配 NSMutableArray indexes 的相同顺序。现在我正在这样做:

int a;
for (a=0; a<self.array.count; a++) {

    NSString *key    = [self.array objectAtIndex:a];
    NSString *object = [self.dictionary objectForKey:key];

    if (object !=nil) {
        [self.array removeObjectAtIndex:a];
        [self.array insertObject:object atIndex:a];
    }
}

有没有更好的方法来重新排序 NSMutableDicitioanry 以匹配 NSMutableArray 的顺序?

谢谢!

【问题讨论】:

  • 字典没有排序。你更大的目标是什么?
  • 另外,NSURLConnection 不符合 NSCopying。您如何将它们用作键?
  • 我写了一个答案,但正确的答案是“你想做什么?”,正如@W'rkncacnter 所说
  • 我有多个需要跟踪的异步 NSURLConnections。最终目标是在 UITableView 上显示一个有序的 NSArray 日期。问题是由于异步连接的性质,日期不会以正确的顺序显示。所以我跟踪数组中的连接,并将包含日期的响应存储在字典中。那么最终的字典将永远不会匹配数组的顺序。这就是为什么我需要一个新的有序数组,其索引将匹配第一个包含 NSURLConnection 描述的数组。
  • 我只是使用键来保持与 NSURLConnections 发生时相同的顺序。

标签: iphone objective-c cocoa-touch nsmutablearray nsmutabledictionary


【解决方案1】:

NSDictionary 不保证其键/值对的任何顺序。没有办法将您的键/值保持在一个固定的顺序中,NSDictionary 像这样工作是没有意义的。 (您使用 keys 而不是 indexes 来检索值)。

如果您希望您的值或键按特定顺序显示以供显示,您可以在检索它们后对其进行排序:

NSArray * sortedKeys = [ [ myDictionary allKeys ] sortedArrayUsingSelector:... ] ;

NSArray * sortedKeys = [ [ myDictionary allKeys ] sortedArrayUsingComparator:... ] ;

然后,您可以根据需要检索已排序键的关联对象。

另一种选择是维护 2 个单独的数组,一个用于键,一个用于值,并保持它们的顺序。

【讨论】:

  • 我有多个需要跟踪的异步 NSURLConnections。最终目标是在 UITableView 上显示一个有序的 NSArray 日期。问题是由于异步连接的性质,日期不会以正确的顺序显示。因此,我跟踪数组中的连接,并将包含日期的响应存储在字典中。那么最终的字典将永远不会匹配数组的顺序。这就是为什么我需要一个新的有序数组,其索引将匹配第一个包含 NSURLConnection 描述的数组。
猜你喜欢
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多