Ответ 1
Если вы хотите сортировать нисходящий, просто переверните сравнения (или переверните NSComparisonResult
s). Там нет необходимости раздувать API, имея параметр ascending:
, когда вы можете напрямую управлять этим в блоке.
Мне нужно создать отсортированный массив 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
) вокруг?
Если вы хотите сортировать нисходящий, просто переверните сравнения (или переверните NSComparisonResult
s). Там нет необходимости раздувать API, имея параметр ascending:
, когда вы можете напрямую управлять этим в блоке.
Просто измените логику:
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
.
Из документации для -sortedArrayUsingComparator:
:
"Возвращает массив, который перечисляет элементы принимающих массивов в порядке возрастания, как определено методом сравнения, заданным данным блоком NSComparator."
Итак, вам придется прибегать к использованию
- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors
но, конечно, это означает, что сначала вы запускаете свои собственные объекты NSSortDescriptor, что вполне может удовлетворить ваши цели.
Вы можете перевернуть операторы вокруг.
"бит, который скрыт от вас" не заботится о восходящем или нисходящем, поскольку он ничего не знает о ваших объектах. Это как просить вашего коллегу, если хоккейная шайба больше или меньше, чем ондатра. Внутренняя реализация просто использует алгоритм сортировки (который, вероятно, определяется с использованием размера вашего массива) и использует вашу блочную функцию для сравнения двух объектов.
В качестве побочной заметки вы можете получить обратный порядок массива, используя этот
[[NSArray reverseObjectEnumerator] allObjects];
Источник: fooobar.com/info/5309/...