使用自定义比较功能对NSDate进行排序

时间:2013-07-31 06:54:13

标签: iphone ios objective-c sorting nsdate

我有一系列日期。这些日期都是NSString对象。现在我想对它们进行排序。这就是我的功能。

NSComparisonResult dateSort(NSString *s1, NSString *s2, void *context) {
    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"dd-MM-YYYY"];

    NSString *date1 = [NSString stringWithFormat:@"%@",s1];
    NSString *date2 = [NSString stringWithFormat:@"%@",s2];

    NSDate *v1 = [df dateFromString: date1];
    NSDate *v2 = [df dateFromString: date2];
   return [v1 compare:v2];

}

我把这个函数叫做这个。

NSArray *sortedKeys = [unsortedKeys sortedArrayUsingFunction:dateSort context:nil];

这是结果

sorted keys are (
    "24-10-2013",
    "28-06-2013",
    "03-10-2013",
    "20-12-2013",
    "04-09-2013",
    "19-09-2013",
    "07-07-2013",
    "15-09-2013",
    "01-07-2013",
    "04-11-2013",
    "27-06-2013",
    "02-10-2013",
    "05-08-2013",
    "17-10-2013",
    "04-10-2013"
)

这不是正确的顺序,我希望它们下降。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:3)

有几个问题:

  • 正确的日期格式为"dd-MM-yyyy"
  • 要订购日期而不是升序,只需替换

    return [v1 compare:v2];
    

    通过

    return [v2 compare:v1];
    
  • stringWithFormat来电完全没必要(正如@rmaddy所评论的那样)。

  • 创建日期格式化程序被认为是一项昂贵的操作,应该只执行一次。

尽管如此,您的比较方法应如下所示:

NSComparisonResult dateSort(NSString *s1, NSString *s2, void *context) {
    static NSDateFormatter *df;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"dd-MM-yyyy"];
    });

    NSDate *v1 = [df dateFromString: s1];
    NSDate *v2 = [df dateFromString: s2];
    return [v2 compare:v1];
}