簡體   English   中英

Objective-C:按工作日對NSDate的NSMutableArray進行排序

[英]Objective-C: Sort NSMutableArray of NSDates by weekday

我在執行以下任務時遇到困難:我有一個NSMutableArray,其中包含從核心數據中提取的NSManagedObjects“ OpeningHours”。

NSMutableArray *openingHoursArray = [NSMutableArray arrayWithArray: [[museum valueForKey:@"openingHours"] allObjects]];

數組未排序,因為從我的NSManagedObject“博物館”獲取鍵的值會返回一個隨機組織的集合。

數組中的NSManagedObjects“ openingHours”具有NSDate類型的值,可通過鍵“ start”和“ end”訪問。 現在,為了以一種有意義的方式顯示我的開放時間,我訪問了各個日期的工作日和時間信息,到目前為止,使用這段代碼可以正常工作:

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:mainDelegate.localeCode];

NSDateFormatter *weekday = [[[NSDateFormatter alloc] init] autorelease];
[weekday setLocale:locale];
[weekday setDateFormat: @"EEEE"];

[NSDateFormatter *time = [[[NSDateFormatter alloc] init] autorelease];
[time setLocale:locale];
[time setTimeStyle:NSDateFormatterShortStyle];

for (NSManagedObject *openingHour in openingHoursArray) {

        NSLog(@"%@", [openingHour valueForKey:@"start"]);
        NSDate *startDate = [openingHour valueForKey:@"start"];
        NSDate *endDate = [openingHour valueForKey:@"end"];


        NSString *startDay = [weekday stringFromDate:startDate];
        NSString *endDay = [weekday stringFromDate:endDate];
        NSString *startTime = [time stringFromDate:startDate];
        NSString *endTime = [time stringFromDate:endDate];


        if (![startDay isEqualToString:endDay]) {
            [openingHoursString appendFormat:@"%@ - %@:\t%@ - %@ \n", startDay, endDay, startTime, endTime];         
        }
        else {
            [openingHoursString appendFormat:@"%@:\t%@ - %@ \n", startDay, startTime, endTime];             
        }

    }

這給了我想要的輸出:

星期四:10:00 AM-9:00 PM

星期五-星期日:10:00 AM-6:00 PM

星期一-星期三:10:00 AM-5:00 PM

現在的問題是:當然,我希望星期一的開放時間首先顯示。 我需要按開始日期值的星期幾對數組進行排序。 我嘗試使用以下方法對其進行排序:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"start" ascending:TRUE];
[openingHoursArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

但是顯然這是行不通的,因為它只是按日期排序,而不幸的是1970-01-01是星期四,因此星期四將是我的數組中按上述代碼排序的第一項。

有人對如何“分類”有個好主意嗎? :-)我對此一無所知。非常感謝!

這樣的事情應該起作用:

NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSArray *sortedArray = [openingHoursArray sortedArrayUsingComparator: ^(id obj1, id obj2) {
    NSDate *startDate1 = [obj1 valueForKey:@"start"];
    NSDate *startDate2 = [obj2 valueForKey:@"start"];
    NSDateComponents *components1 = [calendar components:NSWeekdayCalendarUnit fromDate:startDate1];
    NSDateComponents *components2 = [calendar components:NSWeekdayCalendarUnit fromDate:startDate2];
    NSInteger weekday1 = [components1 weekday];
    if (weekday1 == 1) weekday1 = 8; //Order sundays last
    NSInteger weekday2 = [components2 weekday];
    if (weekday2 == 1) weekday2 = 8;
    return [[NSNumber numberWithInteger:weekday1] compare:[NSNumber numberWithInteger:weekday2]];
}];

代替使用NSSortDescriptor,可以使用NSArray的sortedArrayUsingSelector或NSMutableArray的sortUsingSelector方法,並將@selector(compare:)作為選擇器傳遞。

查看此答案以獲取更多信息: 單擊

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM