如何按顺序从字典中获取所有值
How to get all values from dictionary in ordered manner
我收到这样的 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,...) 的顺序与它们出现的顺序相同,因为我必须使用这些值来绘制某种图形。
有一个更好的方法吗?
使用字典实例方法排序如下:
let dict = ["A": 123, "B": 789, "C": 567, "D": 432]
let dictValInc = dict.sorted(by: { [=10=].value < .value })
结果将是
[(key: "A", value: 123), (key: "D", value: 432), (key: "C", value: 567), (key: "B", value: 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];
}];
NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:@"name"
ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:sortDescriptors];
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
都允许这样做,所以我不建议您仅基于此思考。
我收到这样的 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,...) 的顺序与它们出现的顺序相同,因为我必须使用这些值来绘制某种图形。 有一个更好的方法吗?
使用字典实例方法排序如下:
let dict = ["A": 123, "B": 789, "C": 567, "D": 432]
let dictValInc = dict.sorted(by: { [=10=].value < .value })
结果将是
[(key: "A", value: 123), (key: "D", value: 432), (key: "C", value: 567), (key: "B", value: 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];
}];
NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:@"name"
ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:sortDescriptors];
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
都允许这样做,所以我不建议您仅基于此思考。