Objective-C: сортировка NSMutableArray NSDates по дням недели - PullRequest
4 голосов
/ 19 августа 2011

У меня трудности со следующей задачей: у меня есть NSMutableArray, содержащий NSManagedObjects "OpeningHours", который я извлекаю из основных данных.

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

Массив не отсортирован, так как получение значения для ключей из моего "музея" NSManagedObject возвращает случайно организованный набор.

NSManagedObjects "opensHours" в массиве имеют значения типа 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 - 21:00

Пятница - воскресенье: с 10:00 до 18:00

Понедельник - среда: 10:00 - 17:00

Теперь проблема в том, что, конечно, я хочу, чтобы период открытия понедельника отображался первым. Мне нужно отсортировать мой массив по дням недели значения даты начала. Я попытался отсортировать его с помощью следующего:

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

но, очевидно, это не работает, потому что он просто сортирует по датам, а 1970-01-01, к сожалению, был четверг, поэтому четверг будет первым элементом моего массива, отсортированным по приведенному выше коду.

У кого-нибудь есть хорошая идея о том, как "разобраться"? :-) Я полностью застрял с этим .. Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 19 августа 2011

Примерно так должно работать:

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]];
}];
0 голосов
/ 19 августа 2011

Вместо использования NSSortDescriptor, используйте методы NSArray sortedArrayUsingSelector или NSMutableArray sortUsingSelector и передайте @selector(compare:) в качестве селектора.

См. Этот ответ для получения дополнительной информации: Нажмите

...