Objective-C:按工作日对NSDates的NSMutableArray进行排序

时间:2011-08-19 14:46:13

标签: iphone objective-c ios xcode nsdate

我遇到以下任务有困难:我有一个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 - 晚上9:00

周五 - 周日:上午10:00 - 下午6:00

周一至周三:上午10:00 - 下午5:00

现在的问题是:当然我希望首先显示星期一的开放时间。我需要按开始日期值的工作日对数组进行排序。我尝试使用以下方法对其进行排序:

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

但显然这不起作用,因为它只是按日期排序,并且不幸的是1970-01-01是星期四,因此星期四将是我的数组中按上述代码排序的第一项。

有没有人对如何“解决这个问题”有一个好主意? :-)我完全坚持这个.. 非常感谢!

2 个答案:

答案 0 :(得分:3)

这样的事情应该有效:

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

答案 1 :(得分:-1)

使用NSArray的sortedArrayUsingSelector或NSMutableArray的sortUsingSelector方法,而不是使用NSSortDescriptor,并传入@selector(compare:)作为选择器。

有关详细信息,请参阅此答案:Click