Сортировка NSArray пользовательских объектов по их свойствам NSDate
Я пытаюсь сортировать NSArray, который заполняется пользовательскими объектами. Каждый объект имеет свойство startDateTime
, которое имеет тип NSDate.
Следующий код приводит к массиву sortedEventArray
, заполненному, но не отсортированному. Я иду об этом совершенно неправильно или я просто пропустил что-то маленькое?
NSSortDescriptor *dateDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"startDateTime"
ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor];
NSArray *sortedEventArray = [nodeEventArray sortedArrayUsingDescriptors:sortDescriptors];
Ответы
Ответ 1
Вы уверены, что переменные экземпляра startDateTime
событий node не равны нулю?
Если у вас его еще нет, вы можете добавить () метод -description
к объектам событий node, который сделает что-то вроде этого:
- (NSString *)description {
return [NSString stringWithFormat:@"%@ - %@",
[super description], startDateTime]];
}
Затем в вашем журнале сортировки укажите массив до и после:
NSLog(@"nodeEventArray == %@", nodeEventArray);
NSSortDescriptor *dateDescriptor = [NSSortDescriptor
sortDescriptorWithKey:@"startDateTime"
ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor];
NSArray *sortedEventArray = [nodeEventArray
sortedArrayUsingDescriptors:sortDescriptors];
NSLog(@"sortedEventArray == %@", sortedEventArray);
Если startDateTime
все nil
, массивы до и после будут иметь одинаковый порядок (так как операция сортировки будет равна отправке всех сообщений -compare:
на nil
, что в основном ничего не делает).
Ответ 2
Хорошо, я знаю, что это немного поздно, но вот как я это сделаю:
NSArray *sortedEventArray = [events sortedArrayUsingComparator:^NSComparisonResult(Event *event1, Event *event2) {
return [event1.startDateTime compare:event2.startDateTime];
}];
Очевидно, замените событие классом вашего пользовательского объекта. Преимущество такого подхода заключается в том, что вы защищены от будущего рефакторинга. Если вы должны были реорганизовать и переименовать свойство startDateTime на что-то еще, Xcode, вероятно, не изменит строку, которую вы передаете в дескриптор сортировки. Внезапно ваш код сортировки сломается/ничего не сделает.
Ответ 3
Вы пытались указать компаратор NSDate
?
Например:
NSSortDescriptor *dateDescriptor = [NSSortDescriptor
sortDescriptorWithKey:@"startDateTime"
ascending:YES
selector:@selector(compare:)];
Это должно обеспечить использование правильного компаратора класса NSDate
.
Ответ 4
Вы можете достичь этого, как это,
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:FALSE];
[self.Array sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
Ответ 5
Вы можете добиться этого,
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"anyDateField" ascending:YES];
NSMutableArray *arr = [[array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]]mutableCopy];