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

pos*_*e14 83 sorting cocoa objective-c nsdate nsarray

我有一个NSArray包含这样的日期字符串(即NSString):"星期四,2009年5月21日19:10:09 -0700"

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

谢谢.

vin*_*ber 114

如果我有一个NSMutableArray带有类型NSDateI 字段"beginDate"的对象,则使用NSSortDescriptor如下所示:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
Run Code Online (Sandbox Code Playgroud)

  • 我知道很多时间过去了(当前一个答案被接受时,可能还没有NSSortDescriptor),但是为了将来使用,这个应该是正确的答案. (3认同)

Qui*_*lor 109

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

  • 目前尚不清楚原始问题是询问有关排序日期数组,还是排序具有日期字段的对象数组.如果它是前者,这是最简单的方法,但如果是后者,则NSSortDescriptor是可行的方法. (11认同)

The*_*Art 17

您还可以使用以下内容:

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

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


Kos*_*kyi 9

您可以使用块进行排序:

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

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

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


not*_*oop 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];
Run Code Online (Sandbox Code Playgroud)

使用时NSMutableArray,您可以使用sortArrayUsingFunction:context:.

  • 这是一个坏主意 - 比较函数应该很快,并且不应该为每个比较从字符串创建NSDate对象.如果您已经在使用 - [NSDate compare:],只需将日期存储在数组中并直接使用-sortedArrayUsingSelector :. (9认同)

Jav*_*ría 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返回未排序的字典键,我想按时间顺序显示数据.