对包含字典数组的NSArray进行排序 - 按照"日期"排序键

时间:2015-05-27 10:27:12

标签: ios objective-c iphone arrays sorting

我有以下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]; 

任何想法或解决方案都会有所帮助。

由于

3 个答案:

答案 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];
    }];