【问题标题】:IOS Sort NSDictionary [duplicate]IOS排序NSDictionary [重复]
【发布时间】:2014-02-20 10:49:02
【问题描述】:

开始,这是我的代码:

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL
                                                          URLWithString:url]];

    NSData *response = [NSURLConnection sendSynchronousRequest:request
                                             returningResponse:nil error:nil];

    NSDictionary *publicTimeline = [NSJSONSerialization JSONObjectWithData:response       options:0 error:&jsonParsingError];

    for (NSObject* key in publicTimeline) {
        id value = [publicTimeline objectForKey:key];
        NSLog(@"%@", key);
    }

我在 web 服务上获取的新闻很少,我将其显示在 tableView 中。

我的问题是这些新闻没有按顺序显示。

在我的网络服务中,新闻是有序的,例如我有:

    {"0":{"title":"News1"}}
    {"1":{"title":"News2"}}
    {"2":{"title":"News3"}}

等等。

但在循环中,我“松散”了这个顺序:/ 我希望我的新闻按这个顺序排列,首先是索引为“0”的新闻在“1”之后......

(NSDictionary 似乎松散了这个顺序,例如,在我的代码之后,我的 tableview 中有新闻:“2”、“0”、“1”,而不是我的新闻“0”、“1 ", "2"。)

(我尝试了一些答案,但在我的情况下似乎没有一个:()

有人帮我吗?谢谢,

【问题讨论】:

  • 索引是什么意思?我可以看到嵌套字典?你到底想要什么?
  • 按索引,我想指的是我的网络服务中存在的数字,这里是“0”、“1”、“2”等......
  • 问题是,NSDictionary 似乎松散了这个顺序,例如,在我的代码之后,我的 tableview 中有新闻:“2”、“0”、“1”和不是我的新闻“0”、“1”、“2”。

标签: ios objective-c sorting


【解决方案1】:

这是我上次用来对字典的键进行排序的方法。希望你实现起来会更容易:)

NSMutableArray *sortedArray = [NSMutableArray arrayWithArray:publicTimeline.allKeys];
[sortedArray sortUsingSelector:@selector(localizedStandardCompare:)];

你应该在 sortedArray 中有你的排序键

【讨论】:

  • 是的!非常感谢lotttt,这是解决方案:D
  • 哦不 :D 确实是有序的,但是有一个问题,因为例如,当我这样做时: for (int i = 0; i
  • 在 sortedArray 中,您对 keys 进行了排序。也就是说,你应该这样做:for (int i = 0; i < sortedArray.count; i++) { NSString *key = [sortedArray objectAtIndex:i]; NSLog(@"%@",[publicTimeline objectForKey:key]); } And this will print the value, corresponding to the key in your publicTimeline dictionary. Hope that explains it well :)
  • 是的,你说得对 :) 它正在运行 :) 谢谢你,谢谢所有 :) 我使用 "for (id key in sortedArray) {" 更好,也不需要声明和使用"NSString *key"
【解决方案2】:

您可以使用它:

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:publicTimeline];
[dict keysSortedByValueUsingComparator:^(id obj1, id obj2) {
    return (NSComparisonResult)[obj1 compare:obj2];
}];

然后使用dict 而不是publicTimeline

希望这会有所帮助。

【讨论】:

  • 不,它没有运行,它没有找到“keysSortedByValueUsingComparator”,我忘记了什么?
  • 使用NSMutableDictionary 而不是NSDictionary
  • 好的,我更新了,我设置了你的代码,但是我有一个错误 -[__NSCFDictionary compare:]: unrecognized selector sent to instance 0xbab33e0
  • 我可以看到__NSCFDictionary 是不可变的...NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:publicTimeline];
  • 我需要更多细节,我不明白你的意思:(如果我在做 kessortedbyvalucomarator 之前添加你的代码,我有同样的错误。
【解决方案3】:

字典没有顺序。仅仅因为服务器以特定顺序生成您的 JSON 并不意味着当您使用 NSJSONSerialization 反序列化时它是/可以维护的。

如果您需要维护订单,可以:

A.从字典中获取所有键并对它们进行排序。然后,任何时候您需要按顺序访问(按索引),从数组中获取键并使用它(不要迭代字典)。

B.使用不同的方法对 JSON 进行反序列化,该方法可以保留/提供有关事物处理顺序的数据(RestKit 可以为您做到这一点)。

【讨论】:

  • 我想用一个数组来订购它,但我失败了:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多