我有一个NSArray包含日期字符串(例如NSString)的控件,例如:“ Thu,2009年5月21日19:10:09 -0700”
我需要NSArray按日期排序。我考虑过NSDate先将日期字符串转换为对象,但在如何按NSDate对象排序方面陷入困境。
谢谢。
Answers:
将日期作为NSDate对象存储在NS(Mutable)Array中,然后使用-[NSArray sortedArrayUsingSelector:或-[NSMutableArray sortUsingSelector:]和@selector(compare:)作为参数。该-[NSDate compare:]方法将为您按升序排列日期。这比创建一个NSSortDescriptor更加简单,并且比编写自己的比较函数要简单得多。(NSDate对象知道如何至少与我们希望使用自定义代码完成的效率一样有效地相互比较。)
如果我NSMutableArray的对象具有类型为“ beginDate”的字段,则NSDate使用NSSortDescriptor以下对象:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
-[NSMutableArray sortUsingComparator:](10.6+)并传递一个返回-compare:两个字段调用结果的块。它可能比调用-valueForKey:每个对象更快。您甚至可以使用-sortWithOptions:usingComparator:和传递选项来同时进行排序。
您可以使用块进行适当排序:
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
对于我而言,它的工作原理如下:
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];
返回[d1比较:d2];
}];
我有一本字典,其中所有键的日期都以dd-MM-yyyy格式表示。并且allKeys返回未排序的字典键,我想按时间顺序显示数据。
您可以使用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:改用。
NSDate对象,则可以使用上面的答案,甚至可以使用-[NSMutableArray sortUsingComparator:]10.6中添加的。
有了后NSDate,您可以创建一个NSSortDescriptorwith initWithKey:ascending:,然后使用sortedArrayUsingDescriptors:进行排序。
斯威夫特3.0
myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })
改变这个
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];
只需更改密钥:它必须Date始终