[英]Sort NSArray of custom objects based on sorting of another NSArray of strings
[英]Sort NSArray of date strings or objects
我有一个包含日期字符串(即NSString)的NSArray
,如下所示:“星期四,2009年5月21日19:10:09 -0700”
我需要按日期对NSArray
进行排序。 我想过首先将日期字符串转换为NSDate
对象,但是如何按NSDate
对象进行排序则陷入困境。
谢谢。
如果我有一个NSMutableArray
每个对象都有一个域“BEGINDATE”型NSDate
我使用的是NSSortDescriptor
如下:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:TRUE];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
将日期作为NSDate
对象存储在NS(Mutable)数组中,然后使用-[NSArray sortedArrayUsingSelector:
或-[NSMutableArray sortUsingSelector:]
并传递@selector(compare:)
作为参数。 -[NSDate compare:]
方法将按升序为您排序日期。 这比创建NSSortDescriptor
简单,并且比编写自己的比较函数简单得多。 ( NSDate
对象知道如何将自己相互比较,至少与我们希望使用自定义代码一样有效。)
您还可以使用以下内容:
//Sort the array of items by date
[self.items sortUsingComparator:^NSComparisonResult(id obj1, id obj2){
return [obj2.date compare:obj1.date];
}];
但这确实假设日期存储为NSDate
而不是NString
,这应该没有问题。 我建议最好以原始格式存储数据。 在这种情况下更容易操作。
您可以使用块进行排序:
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
您可以使用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:
代替。
在我的案例中它的作用如下:
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返回未排序的字典键,我想按时间顺序显示数据。
获得NSDate
,可以使用initWithKey:ascending:
创建NSSortDescriptor
,然后使用sortedArrayUsingDescriptors:
进行排序。
改变这个
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
Swift 3.0
myMutableArray = myMutableArray.sorted(by: { $0.date.compare($1.date) == ComparisonResult.orderedAscending })
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.