Некоторые ошибки, обнаруженные при использовании NSSortDescriptor

Я использовал NSSortDescriptor для сортировки объектов по дате в качестве ключа. Мой код:

 NSLog(@"Before sorting: %@", temp);
    NSSortDescriptor *dateSortDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"date" ascending: YES];
    NSArray *sortedArray2 = [temp sortedArrayUsingDescriptors:[NSArray arrayWithObject: dateSortDescriptor]];
    NSLog(@"After sorting: %@", sortedArray2);
    NSMutableArray *afterSorting = [[(NSArray*)sortedArray2 mutableCopy]autorelease];

Это сработало хорошо, когда даты

22/08/2012
23/08/2012
25/09/2012

Однако я обнаружил, что NSSortDescriptor сортирует только по первым двум числам впереди, потому что, когда мои даты немного меняются, мой результат становится таким:

10/09/2012
22/08/2012
23/08/2012

Может ли кто-нибудь посоветовать? Видел много других сообщений, использующих NSSortDescriptor, как и мои коды выше, но они, похоже, нигде не содержат ошибок. Для меня это только сортировка по дням, но не по месяцам! Что я делаю, так это сортирую объекты с ближайшей датой вверху. Спасибо!


person Community    schedule 19.08.2012    source источник
comment
Является ли значение контрольной даты объектом даты или строкой?   -  person rdelmar    schedule 19.08.2012
comment
На самом деле он извлекается из plist, строки. Но я не знаю, как преобразовать его в NSdate. Хм.. Не поделитесь? :)   -  person    schedule 19.08.2012
comment
Должен ли я получить строку, преобразовать ее в NSDate, а затем добавить обратно в массив перед сортировкой или??   -  person    schedule 19.08.2012
comment
Было бы проще преобразовать в даты, затем отсортировать и преобразовать обратно в строку (если вам нужно, чтобы это была строка). В противном случае вам пришлось бы писать собственный сортировщик.   -  person rdelmar    schedule 19.08.2012
comment
Самое простое решение — закодировать даты ГГГГ/ММ/ДД.   -  person Hot Licks    schedule 19.08.2012


Ответы (2)


Порядок сортировки, который вы показали, на самом деле правильный. Проблема в том, что вы сортируете строки, а не даты. Если возможно, заполните свойство date экземплярами NSDate, а не экземплярами NSString, и тогда сортировка будет выполняться так, как вы ожидаете.

Если по какой-то причине вы не можете использовать экземпляры NSDate в свойстве date (что может показаться немного странным, но кто знает), вы можете вместо этого отсортировать массив, отправив ему сообщение sortedArrayUsingComparator: и передав блок, который определяет ваш пользовательский Сортировать.

person jlehr    schedule 19.08.2012
comment
на самом деле я пытался использовать sortedArrayUsingComparator:caseInsensitiveCompare, но это тоже не работает.. хм.. - person ; 20.08.2012
comment
Не понятно, что ты говоришь. caseInsensitiveCompare: — это метод, а не блок. Метод sortedArrayUsingComparator: требует блока в качестве аргумента. Если вы не знакомы с блоками, вот ссылка на Blocks Programming Topics. Но изменение базового типа свойства на NSDate было бы лучшим (и более простым) решением вашей проблемы, чем реализация собственного компаратора. - person jlehr; 20.08.2012

Сортировка работает правильно, так как сравнивается только строка. Таким образом, вам сначала потребуется преобразовать NSDate в NSString, а затем выполнить операцию сортировки в NSDate и вернуться к отсортированному строковому массиву дат, как показано ниже:

- (NSArray *) sortArrayOfDateStrings:(NSArray*)array {

NSMutableArray *sortedArray = [NSMutableArray arrayWithCapacity:0];
NSMutableArray *sortedDateArray = [NSMutableArray arrayWithCapacity:0];
NSDate *dateObject;

for(NSString *dateString in array){

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setDateFormat:@"dd/MM/yyyy"];
NSDate *dateFromString = [[NSDate alloc] init];

dateFromString = [dateFormatter dateFromString:dateString];
[dateFormatter release];

[sortedArray addObject:dateFromString];
}

NSSortDescriptor *dateSortDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"date" ascending: YES];
[sortedDateArray addObjectsFromArray:[sortedArray sortedArrayUsingDescriptors:[NSArray arrayWithObject: dateSortDescriptor]]];

[sortedArray removeAllObjects];

for (NSDate* sortedDate in sortedDateArray){

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy"];
NSString *strDate = [dateFormatter stringFromDate:sortedDate];
NSLog(@"%@", strDate);
[dateFormatter release];

[sortedArray addObject:strDate];
}

return sortedArray
}
person Ankit Thakur    schedule 19.08.2012
comment
Вопрос ОП заключался не в том, как сортировать массив строк, а в том, как сортировать массив объектов на основе свойства даты. - person jlehr; 20.08.2012
comment
Спасибо за разъяснение. Но все же в этом случае будет реализована вышеуказанная логика, просто с изменением объекта быстрого перечисления NSString на NSDictionary или любой относительный объект K-V... - person Ankit Thakur; 20.08.2012