代码之家  ›  专栏  ›  技术社区  ›  Manju SSP

如何在目标c中使用NSSortDescriptor按升序或降序对月份名称进行排序

  •  -1
  • Manju SSP  · 技术社区  · 7 年前

    我需要使用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月

    1 回复  |  直到 7 年前
        1
  •  0
  •   Larme    7 年前
    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 所以你需要创建一个 NSDate 这可以简单地进行比较。 如果需要,可以将该日期保存在数组的字典中,或者使用 sortedArrayUsingComparator: 用一个积木。

    要颠倒顺序,最简单的方法是:

    return [finalDate1 compare:finalDate2];
    

    return [finalDate2 compare:finalDate1];
    

    注:施工方式 finalDate1 / finalDate2 可能不是最佳选择。