簡體   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