Установка нескольких дескрипторов сортировки

У меня есть массив объектов и нужно сортировать его по рейтингу и по количеству голосов потомков (так что, если сравнить два оцененных элемента с 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]];