我正在获得这样的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,...)的顺序与它们的顺序相同,因为我必须使用这些值来绘制某种图形。 有一个更好的方法吗?
答案 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];