Изменение порядка сортировки - [NSArray sortedArrayUsingComparator:]

Мне нужно создать отсортированный массив NSNumber из другого 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) вокруг?

Ответ 1

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

Ответ 2

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

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.

Ответ 3

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

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

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

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

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

Ответ 4

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

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

Ответ 5

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

[[NSArray reverseObjectEnumerator] allObjects];

Источник: fooobar.com/info/5309/...