如何在 objective c 中使用 NSSortDescriptor 对月份名称进行升序或降序排序
How to sort month name in ascending or descending order using NSSortDescriptor in objective c
我需要使用 NSSortDescriptor 对月份和年份进行升序或降序排序我有一个数组
{
month = Dec;
year = 2017;
},
{
month = Oct;
year = 2017;
},
{
month = Jan;
year = 2018;
}
我以前做过这个代码
NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"year" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
yeardata = [NSMutableArray arrayWithArray:[yeardata sortedArrayUsingDescriptors:sortDescriptors]];
for (NSDictionary * dic in yeardata)
{
NSString * stryear = [dic objectForKey:@"year"];
NSString * strmonth = [dic objectForKey:@"month"];
[year addObject:[NSString stringWithFormat:@"%@ , %@",strmonth,stryear]];
}
我需要对数据进行排序是
2017 年 2 月
2017 年 3 月
2017 年 6 月
2017 年 8 月
2018 年 1 月
NSArray *array = @[@{
@"month":@"Dec",
@"year": @"2017",
},
@{
@"month":@"Oct",
@"year": @"2017",
},
@{
@"month":@"Jan",
@"year": @"2018",
}];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMM"];
NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(NSDictionary * _Nonnull dict1, NSDictionary * _Nonnull dict2) {
NSDate *date1 = [dateFormatter dateFromString:dict1[@"month"]];
NSDateComponents *components1 = [[NSCalendar currentCalendar] components:NSCalendarUnitMonth fromDate:date1];
[components1 setYear:[dict1[@"year"] integerValue]];
NSDate *date2 = [dateFormatter dateFromString:dict2[@"month"]];
NSDateComponents *components2 = [[NSCalendar currentCalendar] components:NSCalendarUnitMonth fromDate:date2];
[components2 setYear:[dict2[@"year"] integerValue]];
NSDate *finalDate1 = [[NSCalendar currentCalendar] dateFromComponents:components1];
NSDate *finalDate2 = [[NSCalendar currentCalendar] dateFromComponents:components2];
return [finalDate1 compare:finalDate2];
}];
NSLog(@"Sorted: %@", sorted);
输出:
$>Sorted: (
{
month = Oct;
year = 2017;
},
{
month = Dec;
year = 2017;
},
{
month = Jan;
year = 2018;
}
)
这是什么逻辑?
你不能用简单的 NSSortDescriptor
来做到这一点,因为你的月份是字母,而 "Dec" 在 "Oct" 字母顺序之前,但不是在 "time" 之前。
所以你需要创建一个可以简单比较的NSDate
。
如果需要,您可以将该日期保存在数组的字典中,或者使用带有块的 sortedArrayUsingComparator:
。
要颠倒顺序,块中最简单的方法:
return [finalDate1 compare:finalDate2];
或
return [finalDate2 compare:finalDate1];
注意:finalDate1
/finalDate2
的构造方式可能不是最优的。
我需要使用 NSSortDescriptor 对月份和年份进行升序或降序排序我有一个数组
{
month = Dec;
year = 2017;
},
{
month = Oct;
year = 2017;
},
{
month = Jan;
year = 2018;
}
我以前做过这个代码
NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"year" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
yeardata = [NSMutableArray arrayWithArray:[yeardata sortedArrayUsingDescriptors:sortDescriptors]];
for (NSDictionary * dic in yeardata)
{
NSString * stryear = [dic objectForKey:@"year"];
NSString * strmonth = [dic objectForKey:@"month"];
[year addObject:[NSString stringWithFormat:@"%@ , %@",strmonth,stryear]];
}
我需要对数据进行排序是 2017 年 2 月 2017 年 3 月 2017 年 6 月 2017 年 8 月 2018 年 1 月
NSArray *array = @[@{
@"month":@"Dec",
@"year": @"2017",
},
@{
@"month":@"Oct",
@"year": @"2017",
},
@{
@"month":@"Jan",
@"year": @"2018",
}];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMM"];
NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(NSDictionary * _Nonnull dict1, NSDictionary * _Nonnull dict2) {
NSDate *date1 = [dateFormatter dateFromString:dict1[@"month"]];
NSDateComponents *components1 = [[NSCalendar currentCalendar] components:NSCalendarUnitMonth fromDate:date1];
[components1 setYear:[dict1[@"year"] integerValue]];
NSDate *date2 = [dateFormatter dateFromString:dict2[@"month"]];
NSDateComponents *components2 = [[NSCalendar currentCalendar] components:NSCalendarUnitMonth fromDate:date2];
[components2 setYear:[dict2[@"year"] integerValue]];
NSDate *finalDate1 = [[NSCalendar currentCalendar] dateFromComponents:components1];
NSDate *finalDate2 = [[NSCalendar currentCalendar] dateFromComponents:components2];
return [finalDate1 compare:finalDate2];
}];
NSLog(@"Sorted: %@", sorted);
输出:
$>Sorted: (
{
month = Oct;
year = 2017;
},
{
month = Dec;
year = 2017;
},
{
month = Jan;
year = 2018;
}
)
这是什么逻辑?
你不能用简单的 NSSortDescriptor
来做到这一点,因为你的月份是字母,而 "Dec" 在 "Oct" 字母顺序之前,但不是在 "time" 之前。
所以你需要创建一个可以简单比较的NSDate
。
如果需要,您可以将该日期保存在数组的字典中,或者使用带有块的 sortedArrayUsingComparator:
。
要颠倒顺序,块中最简单的方法:
return [finalDate1 compare:finalDate2];
或
return [finalDate2 compare:finalDate1];
注意:finalDate1
/finalDate2
的构造方式可能不是最优的。