Установка нескольких дескрипторов сортировки
У меня есть массив объектов и нужно сортировать его по рейтингу и по количеству голосов потомков (так что, если сравнить два оцененных элемента с 5 звездами, первый с большинством голосов должен быть первым)
Можно ли отсортировать NSArray двумя дескрипторами: сначала после оценки, а затем после подсчета голосов?
Я нашел на http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSSortDescriptor_Class/Reference/Reference.html
что-то вроде sortUsingDescriptors:
, но я не могу найти его нигде в документах, считайте его устаревшим.
Ответы
Ответ 1
Да, вы можете:
NSSortDescriptor *sortRating = [[NSSortDescriptor alloc] initWithKey:@"rating" ascending:NO];
NSSortDescriptor *sortVotes = [[NSSortDescriptor alloc] initWithKey:@"votes" ascending:NO];
NSArray *sortedArray = [orignalAray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortRating, sortVotes, nil]];
[sortRating release], sortRating = nil;
[sortVotes release], sortVotes = nil;
Ответ 2
Вы в основном правы. На NSArray есть
- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors
метод. Это вернет новый массив, отсортированный по различным дескрипторам.
- (void)sortUsingDescriptors:(NSArray *)sortDescriptors
существует, но находится в NSMutableArray, что может объяснить, почему вы не смогли найти его в документации для NSArray. Он выполняет ту же цель, но сортирует массив, на который вы его называете, вместо того, чтобы возвращать новый массив. Также не рекомендуется.
Ответ 3
Здесь однострочный.
NSArray *sortedArray = [unsortedArray sortUsingDescriptors:[NSArray arrayWithObjects:[NSSortDescriptor [email protected]"rating" ascending:NO], [NSSortDescriptor [email protected]"date" ascending:NO], nil]];
Ответ 4
Используйте - (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors
. Вот документация: NSArray
Ссылка на класс
например:
NSSortDescriptor *sortRating = nil;
NSSortDescriptor *sortDate = nil;
NSSortDescriptor *sortRating = [[NSSortDescriptor alloc] initWithKey:@"rating" ascending:NO];
NSSortDescriptor *sortDate = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
NSArray *sortedArray = [auxArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortRating,sortDate,nil]];
[sortRating release];
sortRating = nil;
[sortDate release];
sortDate = nil;
Ура!
Ответ 5
Если у вас есть один NSArray, используйте этот:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"x_date" ascending:TRUE];
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"x_time" ascending:TRUE];
[tempArray sortUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor,sortDescriptor1, nil]];