我有以下NSArray,其中包含每个索引的字典,这里是内容,只提供前3条记录 -
[
{
"postDate": "4/11/2011 2:03:33 PM",
"imageLink": "",
"eventLink": "www.google.com"
},
{
"postDate": "6/16/2011 1:42:45 PM",
"imageLink": "",
"eventLink": "www.google.com"
},
{
"postDate": "9/21/2011 10:22:34 AM",
"imageLink": "",
"eventLink": "www.google.com"
}
]
注意: - postDate
只是一个NSString,它不是NSDate类型,但我必须根据此键执行排序。
我的任务是根据" postDate"对数组进行排序。 key,表示整个数组将按日期排序(升序/降序)。
我使用了以下代码,但没有帮助,因为arr
存储了arrEventsData
的所有数据,但排序没有发生: -
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"postDate" ascending:YES];
NSMutableArray *arr = [[arrEventsData sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]]mutableCopy];
任何想法或解决方案都会有所帮助。
由于
答案 0 :(得分:2)
像这样:
NSMutableArray *sortedArray = [arr sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) {
NSDate *d1 = [self stringToDate:obj1[@"postDate"]];
NSDate *d2 = [self stringToDate:obj2[@"postDate"]];
return [d1 compare:d2];
}];
对于“stringToDate”方法,无论如何要实现它,请在此处查看另一个SO答案:Convert NSString of a date to an NSDate
编辑:正如@Droppy指出的那样,一旦数据从服务器到达,最好将字符串解析为NSDate。这可以防止在排序中进行昂贵的重复转换,并且无论如何都可能更有用。
答案 1 :(得分:2)
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"M/dd/yyyy H:mm:ss a"];
NSArray *sortedByDates = [arr sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2)
{
NSDate *date1 = [dateFormatter dateFromString:obj1[@"postDate"]];
NSDate *date2 = [dateFormatter dateFromString:obj2[@"postDate"]];
return [date1 compare:date2];
}];
NSLog(@"Sorted Array : %@",sortedByDates);
答案 2 :(得分:0)
您必须从那些NSDate
创建NSString
个对象才能使compare
工作
创建一个静态NSDateFormatter,因为它们的创建成本很高:
NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *a, NSDictionary *b) {
static NSDateFormatter *dateFormatter = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //Set correct format here
});
NSDate *first = [dateFormatter dateFromString:[a objectForKey:@"postDate"]];
NSDate *second = [dateFormatter dateFromString:[b objectForKey:@"postDate"]];
return [first compare:second];
}];