对日期字符串或对象的NSArray进行排序

时间:2009-07-15 17:33:58

标签: objective-c cocoa sorting nsarray nsdate

我有一个NSArray,其中包含日期字符串(即NSString),如下所示:“星期四,2009年5月21日19:10:09 -0700”

我需要按日期对NSArray进行排序。我考虑过首先将日期字符串转换为NSDate对象,但是如何按NSDate对象进行排序则会陷入困境。

感谢。

9 个答案:

答案 0 :(得分:113)

如果我的NSMutableArray个对象的字段“beginDate”类型为NSDate,我使用的是NSSortDescriptor,如下所示:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];

答案 1 :(得分:109)

将日期作为NSDate个对象存储在NS(可变)数组中,然后使用-[NSArray sortedArrayUsingSelector:-[NSMutableArray sortUsingSelector:]并传递 @selector(compare:) 作为参数。 -[NSDate compare:]方法将按升序为您排序日期。这比创建NSSortDescriptor更简单,并且比编写自己的比较函数简单得多。 (NSDate对象知道如何将自己相互比较,至少与我们希望使用自定义代码一样有效。)

答案 2 :(得分:16)

您也可以使用以下内容:

//Sort the array of items by  date
    [self.items sortUsingComparator:^NSComparisonResult(id obj1, id obj2){
        return [obj2.date compare:obj1.date];
    }];

但是这确实假设日期存储为NSDate而不是NString ,这应该没有问题。我建议最好以原始格式存储数据。在这种情况下更容易操作。

答案 3 :(得分:9)

您可以使用块进行排序:

sortedDatesArray = [[unsortedDatesArray sortedArrayUsingComparator: ^(id a, id b) {
    NSDate *d1 = [NSDate dateWithString: s1];
    NSDate *d2 = [NSDate dateWithString: s2];
    return [d1 compare: d2];
}];

我建议您在排序之前将所有字符串转换为日期,以便比日期项目更多次地进行转换。任何排序算法都会为您提供更多的字符串到日期转换,而不是数组中的项目数(有时更多)

关于块排序的更多信息:http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html

答案 4 :(得分:5)

您可以使用sortedArrayUsingFunction:context:。这是一个示例:

NSComparisonResult dateSort(NSString *s1, NSString *s2, void *context) {
    NSDate *d1 = [NSDate dateWithString:s1];
    NSDate *d2 = [NSDate dateWithString:s2];
    return [d1 compare:d2];
}

NSArray *sorted = [unsorted sortedArrayUsingFunction:dateSort context:nil];

使用NSMutableArray时,您可以使用sortArrayUsingFunction:context:代替。

答案 5 :(得分:5)

在我的案例中它的作用如下:

    NSArray *aUnsorted = [dataToDb allKeys];
    NSArray *arrKeys = [aUnsorted sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"dd-MM-yyyy"];
        NSDate *d1 = [df dateFromString:(NSString*) obj1];
        NSDate *d2 = [df dateFromString:(NSString*) obj2];
        return [d1 compare: d2];
    }];

我有一本字典,其中所有键的日期格式为dd-MM-yyyy。并且allKeys返回未分类的字典键,我想按时间顺序显示数据。

答案 6 :(得分:4)

获得NSDate后,您可以使用NSSortDescriptor创建initWithKey:ascending:,然后使用sortedArrayUsingDescriptors:进行排序。

答案 7 :(得分:1)

更改此

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Date" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];

只需更改KEY:它必须始终为Date

答案 8 :(得分:1)

Swift 3.0

myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })