Изменение порядка сортировки - [NSArray sortedArrayUsingComparator:] - PullRequest
18 голосов
/ 08 ноября 2011

Мне нужно сгенерировать отсортированный массив NSNumber s из другого NSArray.Я хочу использовать метод sortedArrayUsingComparator:.Я нашел этот пример в документации Apple:

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
    if ([obj1 integerValue] > [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedDescending;
    }

    if ([obj1 integerValue] < [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedAscending;
    }

    return (NSComparisonResult)NSOrderedSame;
}];

Здесь я просто предоставляю компаратор в блоке, и это нормально.Сама сортировка - та часть, которая скрыта от меня, которая использует этот блок - кажется восходящей.

Я хотел бы знать, могу ли я запросить другой порядок сортировки, внешний для этого блока, или мне просто нужно перевернуть < и > (или NSOrderedXXX)вокруг?

Ответы [ 5 ]

24 голосов
/ 08 ноября 2011

Если вы хотите отсортировать по убыванию, просто переверните сравнения (или NSComparisonResult s). Нет необходимости увеличивать API, имея параметр ascending:, когда вы можете напрямую контролировать его в блоке.

4 голосов
/ 29 мая 2013

Как примечание, вы можете получить обратный порядок массива, используя эту

[[NSArray reverseObjectEnumerator] allObjects];

Источник: https://stackoverflow.com/a/586529/1382210

4 голосов
/ 08 ноября 2011

Вы можете перевернуть операторов.

«Бит, который скрыт от вас», не заботится о подъеме или спуске, поскольку он ничего не знает о ваших объектах.Это все равно, что спросить своего коллегу, больше или меньше хоккейная шайба, чем ондатра.Внутренняя реализация просто использует алгоритм сортировки (который, вероятно, определяется с использованием размера вашего массива) и использует вашу блочную функцию для сравнения двух объектов.

4 голосов
/ 08 ноября 2011

Из документации на -sortedArrayUsingComparator::

"Возвращает массив, в котором перечислены элементы принимающего массива в порядке возрастания, как определено методом сравнения, заданным данным блоком NSComparator."

Так что вам придется прибегнуть к использованию

- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors

но, конечно, это означает, что сначала нужно свернуть свои собственные объекты NSSortDescriptor, которые могут вполне соответствовать вашим целям.

4 голосов
/ 08 ноября 2011

Просто измените логику:

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {

 if ([obj1 integerValue] > [obj2 integerValue]) {
      return (NSComparisonResult)NSOrderedAscending;
 }

 if ([obj1 integerValue] < [obj2 integerValue]) {
      return (NSComparisonResult)NSOrderedDescending;
 }
 return (NSComparisonResult)NSOrderedSame;
}];

Для ясности лучше всего сделать этот метод с именем, похожим на: decendingSort.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...