Отсортируйте NSArray в порядке убывания

Я имею NSArray из NSNumber объекты, что я успешно отсортировал в порядке возрастания использование следующего:

[myArray sortedArrayUsingSelector:@selector(compare:)]

Однако я должен отсортировать это в порядке убывания. Я беру его это compare: только виды в порядке возрастания. В то время как я могу пойти об инвертировании NSArray, Мне любопытно относительно того, существует ли более более простой или более эффективный способ идти о выполнении этого.

Править: Я нашел этот вопрос, который обеспечивает, простой способ инвертировать выполняют итерации NSArray:

for (id someObject in [myArray reverseObjectEnumerator])

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

34
задан ROMANIA_engineer 21 October 2017 в 08:58
поделиться

5 ответов

Использовать дескриптор сортировки

NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"self" 
                                                            ascending: NO];
return [myArray sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]];
80
ответ дан 27 November 2019 в 16:03
поделиться

Другой способ, imo, тоже неплох: напишите еще один reverseCompare с категорией:

@implementation NSNumber (Utility)

- (NSComparisonResult)reverseCompare:(NSNumber *)aNumber {
  return [aNumber compare:self];
}

Хорошо то, что вы можете повторно использовать везде и не нужно писать цикл с обратная итерация. Плохо то, что приходится писать больше кода :)

12
ответ дан 27 November 2019 в 16:03
поделиться

Есть несколько способов:

  1. Напишите функцию сравнения и передайте ее sortUsingFunction: context: .
  2. Используйте sortUsingComparator: , который принимает блок. (Доступно только в Mac OS X 10.6 и новее и iOS 4.0 и новее.)
  3. Используйте sortUsingDescriptors: и передайте массив хотя бы одного дескриптора сортировки, свойство ascending ложный.

В первых двух случаях ваше сравнение должно просто вернуть отрицание того, какой компаратор вы обычно используете (например, compare: ). Последний включает меньше настраиваемого кода, поэтому я бы его использовал.

6
ответ дан 27 November 2019 в 16:03
поделиться

селектор comare должен возвращать NSComparisonResult. На самом деле это ваша функция, поэтому вы можете написать другую функцию, которая возвращает противоположный результат для сортировки в порядке убывания.

1
ответ дан 27 November 2019 в 16:03
поделиться

Dr. На веб-сайте Touch есть хорошая реализация категории в NSArray для создания самосортированного массива. Это можно изменить, чтобы сортировка оставалась в любом подходящем порядке.

1
ответ дан 27 November 2019 в 16:03
поделиться