繁体   English   中英

排序包含字典数组的NSArray-按“日期”键排序

[英]Sorting NSArray which contain array of dictionaries - Sort as per “Date” key

我有以下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”键对数组进行排序 ,这意味着整个数组将按日期 (升序/降序)进行排序

我使用了下面的代码,但是没有帮助,因为arrarrEventsData存储了所有数据,但是排序没有发生:-

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"postDate"  ascending:YES];

    NSMutableArray *arr = [[arrEventsData sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]]mutableCopy]; 

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

谢谢

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);

像这样:

    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答案: 将日期的NSString转换为NSDate

编辑:正如@Droppy所指出的,一旦数据从服务器到达,最好将字符串解析为NSDate。 这样可以避免在分类中进行昂贵的重复转换,并且无论如何可能更有用。

您将必须从这些NSString创建NSDate对象以使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];
    }];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM