【问题标题】:With fast enumeration and an NSDictionary, iterating in the order of the keys is not guaranteed – how can I make it so it IS in order?使用快速枚举和 NSDictionary,不能保证按键的顺序进行迭代——我怎样才能使它按顺序排列?
【发布时间】:2013-07-31 08:52:35
【问题描述】:

我正在与一个 API 通信,该 API 将 NSDictionary 作为响应,其中包含我的应用所需的数据(数据基本上是一个提要)。此数据按最新到最旧排序,最新的项目位于 NSDictionary 的前面。

当我用for (NSString *key in articles) { ... } 快速枚举它们时,顺序似乎是随机的,因此我对它们进行操作的顺序并不是我想要的从最新到最旧的顺序,而是完全随机的。

我已经阅读,当使用 NSDictionary 的快速枚举时,不能保证按顺序遍历数组。

但是,我需要它。如何让它按照 NSDictionary 所在的顺序遍历 NSDictionary?

【问题讨论】:

  • 那就自己写字典吧。如果 CF/NSDictionary 说他们不能保证顺序,那么他们不能保证顺序。编写一个好的排序算法可能并不难,但如果你需要它们以插入顺序,如果不以某种方式标记对象可能会很棘手。
  • 您对 API 有任何意见吗?听起来它应该向您发送一个数组,而不是字典。

标签: ios objective-c nsdictionary for-in-loop fast-enumeration


【解决方案1】:

一种方法是获取可变数组中的所有键:

NSMutableArray *allKeys = [[dictionary allKeys] mutableCopy];

然后根据需要对数组进行排序:

[allKeys sortUsingComparator: ....,]; //or another sorting method

然后您可以遍历数组(我认为在这里使用快速枚举保持顺序),并获取当前键的字典值:

for (NSString *key in allKeys) {
   id object = [dictionary objectForKey: key];
   //do your thing with the object 
 }

【讨论】:

  • 为什么是mutableCopy?我认为最好使用[dictionary allKeys]
  • 因为在那之后 allKeys 数组被排序。这只能通过a)使其成为可变数组或b)创建另一个排序数组(如rmaddys答案)。这是一个偏好的选择,任何东西都和另一个一样好。但是很高兴评论这个 2 岁的,已接受的答案;)
  • 嗨,在这里查看我的答案:stackoverflow.com/questions/32986/…
【解决方案2】:

根据定义,字典是无序的。如果要对键应用顺序,则需要对键进行排序。

NSArray *keys = [articles allKeys];
NSArray *sortedKeys = [keys sortedArrayUsingSelector:@selector(compare:)];
for (NSString *key in sortedKeys) {
    // process key
}

更新键的排序方式以满足您的需求。

【讨论】:

    【解决方案3】:

    正如其他人所说,您不能保证 NSDictionary 中的订单。有时订购 allKeys 属性并不是您真正想要的。如果您真正想要的是按您的密钥插入到您的 dict 中的顺序来枚举您的 dict,您可以创建一个新的 NSMutableArray 属性/变量来存储您的密钥,这样它们将保留其顺序。

    每次你将在字典中插入一个新键时,将它插入到你的数组中:

    [articles addObject:someArticle forKey:@"article1"];
    [self.keys addObject:@"article1"];
    

    要按顺序列举它们,只需:

    for (NSString *key in self.keys) {
       id object = articles[key];
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      相关资源
      最近更新 更多