如何以有序的方式从字典中获取所有值

时间:2018-03-27 12:21:47

标签: ios objective-c json nsdictionary

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

3 个答案:

答案 0 :(得分:2)

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

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];
 }];

答案 1 :(得分:2)

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都允许,所以我不建议只根据您的想法。

答案 2 :(得分:-1)

NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:@"name"
    ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:sortDescriptors];