【问题标题】:How to get all values from dictionary in ordered manner如何以有序的方式从字典中获取所有值
【发布时间】:2018-09-05 20:28:05
【问题描述】:

我得到一个这样的 JSON:

{
    "count": {
        "2018-03-26 07": 4,
        "2018-03-26 08": 21,
        "2018-03-26 09": 34,
        "2018-03-26 10": 43,
        "2018-03-26 11": 64,
        "2018-03-26 12": 48,
        "2018-03-26 13": 31,
        "2018-03-26 14": 45,
        "2018-03-26 15": 48,
        "2018-03-26 16": 45,
        "2018-03-26 17": 40,
        "2018-03-26 18": 44,
        "2018-03-26 19": 58,
        "2018-03-26 20": 49,
        "2018-03-26 21": 60,
        "2018-03-26 22": 46,
        "2018-03-26 23": 35,
        "2018-03-27 00": 34,
        "2018-03-27 01": 36,
        "2018-03-27 02": 16,
        "2018-03-27 03": 23,
        "2018-03-27 04": 14,
        "2018-03-27 05": 12,
        "2018-03-27 06": 12,
        "2018-03-27 07": 1
    }
}

现在要从这个字典中获取所有值,我尝试了 [dict allValues] 但它以无序格式返回字典。 手动创建这些键并按顺序获取所有值将花费更多精力。 我想要的是所有这些值 (4,21,34,...) 的顺序与它们的顺序相同,因为我必须使用这些值来绘制某种图形。 有一个更好的方法吗?

【问题讨论】:

  • 定义你想要的“订单”。此外,没有订购字典。换句话说,向我们展示您想要的结果以及原因。
  • 我编辑了我想要什么顺序的问题@Larme
  • 随着“钥匙”的到来。我认为您的钥匙在第一部分和第二部分都加盖了时间戳(或表示小时)。
  • 由于 JSON 构造不佳,我建议在 web api 结束时设置日期排序。
  • @Nitish 实际上人们很长时间以来都在网络上使用相同的 api。它不能改变。顺便说一句,我从 Larme 那里得到了所需的答案

标签: ios objective-c json nsdictionary


【解决方案1】:

使用排序如下的字典实例方法:

let dict = ["A": 123, "B": 789, "C": 567, "D": 432]
let dictValInc = dict.sorted(by: { $0.value < $1.value })

结果是

[(键:“A”,值:123),(键:“D”,值:432),(键:“C”,值:567),(键:“B”,值:789 )]

在 Objective-c 中,您可以使用那里的值对字典键进行排序

NSDictionary *dict = @{@"A": @(123), @"B": @(789), @"C": @(567), @"D": @(432)};
NSArray *keys = [dict allKeys];
NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    NSString *first = [dict objectForKey:a];
    NSString *second = [dict objectForKey:b];
    return [first compare:second];
}];

如果你希望你的数组按它们的键排序:

 NSArray *keys = [dict allKeys];
 NSArray *sortedKeys = [keys sortedArrayUsingComparator:^(id a, id b) {
     return [a compare:b options:NSNumericSearch];
 }];

【讨论】:

  • 请看标签是obj c
  • 我不认为您的代码是用户想要的。如果您检查作者的答案,目标结果是“(4,21,34,...)”,它不是以“1”开头(这是其样本的最后一个值)。
  • 是的,但如果他使用我上面提到的 where 值进行排序,他将获得按那里值排序的键。例如:他会得到“2018-03-27 07”的值为1 “2018-03-26 07”的值为4等等......
  • 实际上问题不是关于排序,而是关于在获取所有值的同时获得相同的顺序。 @JabaOdishelashvili
  • 你的 json 接缝是按它们的键排序的。我对吗?所以你可以用他们的键对你的字典进行排序。如果不是,则无法实现,因为 json 是无序集。
【解决方案2】:
NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:@"name"
    ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:sortDescriptors];

【讨论】:

  • 你的答案与问题无关,请根据答案更新答案
【解决方案3】:
NSString *jsonStr = @"{\"count\":{\"2018-03-26 07\":4,\"2018-03-26 08\":21,\"2018-03-26 09\":34,\"2018-03-26 10\":43,\"2018-03-26 11\":64,\"2018-03-26 12\":48,\"2018-03-26 13\":31,\"2018-03-26 14\":45,\"2018-03-26 15\":48,\"2018-03-26 16\":45,\"2018-03-26 17\":40,\"2018-03-26 18\":44,\"2018-03-26 19\":58,\"2018-03-26 20\":49,\"2018-03-26 21\":60,\"2018-03-26 22\":46,\"2018-03-26 23\":35,\"2018-03-27 00\":34,\"2018-03-27 01\":36,\"2018-03-27 02\":16,\"2018-03-27 03\":23,\"2018-03-27 04\":14,\"2018-03-27 05\":12,\"2018-03-27 06\":12,\"2018-03-27 07\":1}}";
NSData *jsonData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];

NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];

NSDictionary *countDict = jsonDict[@"count"];

NSArray *keys = [countDict allKeys];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH"];
NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(NSString * _Nonnull dateStr1, NSString * _Nonnull dateStr2) {
    NSDate *date1 = [dateFormatter dateFromString:dateStr1];
    NSDate *date2 = [dateFormatter dateFromString:dateStr2];
    return [date1 compare:date2];
}];

NSMutableArray *valuesSorted = [[NSMutableArray alloc] init];
for (NSString *aDateStringKey in sortedKeys)
{
    [valuesSorted addObject:countDict[aDateStringKey]];
}
NSLog(@"valuesSorted: %@", valuesSorted);

这是什么逻辑:
检索所有密钥。
对键进行排序。
遍历该排序键并附加相应的值。

在您的特定情况下,NSString 日期很容易比较,您可以改为:

NSArray *sortedKeys = [keys sortedArrayUsingSelector:@selector(compare:)];

而不是:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH"];
NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(NSString * _Nonnull dateStr1, NSString * _Nonnull dateStr2) {
    NSDate *date1 = [dateFormatter dateFromString:dateStr1];
    NSDate *date2 = [dateFormatter dateFromString:dateStr2];
    return [date1 compare:date2];
}];

但这是一个特殊的设计,因为你有他们有一个允许它的dateFormat。并非所有dateFormat 都允许这样做,所以我不建议您仅以此为基础。

【讨论】:

    猜你喜欢
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2014-07-21
    • 2011-10-23
    • 2013-11-12
    • 1970-01-01
    相关资源
    最近更新 更多