Сортировать NSArray в порядке убывания - PullRequest
34 голосов
/ 04 августа 2010

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

[myArray sortedArrayUsingSelector:@selector(compare:)]

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

РЕДАКТИРОВАТЬ : я нашел этот вопрос , который предоставляет простой способ отменить итерацию NSArray:

for (id someObject in [myArray reverseObjectEnumerator])

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

Ответы [ 11 ]

80 голосов
/ 04 августа 2010

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

NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"self" 
                                                            ascending: NO];
return [myArray sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]];
12 голосов
/ 04 августа 2010

Другой способ, ИМО, тоже хорош: напиши еще один реверс по сравнению с категорией:

@implementation NSNumber (Utility)

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

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

6 голосов
/ 12 апреля 2015

используйте метод sortarrayusingcomparator, подобный этому

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

при обратном порядке объектов вы получите нисходящий порядок

6 голосов
/ 04 августа 2010

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

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

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

3 голосов
/ 31 марта 2016

У меня есть mutableArray и я хочу отсортировать в порядке убывания с помощью клавиши «число». Клавиша «число» - это строка типа «12345», «12346». Таким образом, я пытался выглядеть очень хорошо. Надеюсь, вам поможет!

NSComparisonResult result;

NSArray *arrTem = [multableArr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    if([obj1 valueForKey:@"number"] > [obj2 valueForKey:@"number"])
         result = NSOrderedDescending;
    result = NSOrderedSame;
}];

return [[NSMutableArray alloc]initWithArray:arrTem];
2 голосов
/ 23 сентября 2015

Пример данных подобен этому, и мы хотим отсортировать NSArray на основе ключа sId.

<__NSArrayM 0x7ffc725af1d0>(
{
    sId = 3;
    vName = ABC;
},
{
    sId = 10;
    vName = DEF;
},
{
    sId = 9;
    vName = GHI;
},
{
    sId = 7;
    vName = JKL;
},
{
    sId = 1;
    vName = MNO;
}
)

Решение как ниже

NSArray *sortedArray = [arrOptions sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    if ([[obj1 valueForKey:@"sId"] integerValue] > [[obj2 valueForKey:@"sId"] integerValue]) {
        return (NSComparisonResult)NSOrderedDescending;
    }
    if ([[obj1 valueForKey:@"sId"] integerValue] < [[obj2 valueForKey:@"sId"] integerValue]) {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
}];
NSLog(@"Sorted Service Array is ::%@",sortedArray);
1 голос
/ 04 августа 2010

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

1 голос
/ 04 августа 2010
Селектор

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

0 голосов
/ 17 ноября 2016

Используйте следующий код для сортировки массива на основе ключа, по которому вы хотите отсортировать массив tge (например, имя, код, адрес, emp_id и т. Д ...)

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Enter Sort Type" ascending:NO];

NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
return [array sortedArrayUsingDescriptors:sortDescriptors];
0 голосов
/ 05 мая 2016

мы можем сделать это просто используя sortUsingSelector.Код выглядит следующим образом:

NSMutableArray *arr=[[NSMutableArray alloc]initWithObjects: ..objects.. ];
//Can also use NSArray.
[arr sortUsingSelector:@selector(compare:options:)];
NSString *temp;
int i,j;
i=0;
j=[arr count];
for(i=0;i<([arr count]-1);i++)
{
    temp=[arr objectAtIndex:i];
    [arr replaceObjectAtIndex:i withObject:[arr objectAtIndex:j]];
    [arr replaceObjectAtIndex:j withObject:temp];
    j--;
}
NSLog(@"New array is:%@",arr);

Вы можете подумать, что это глупый ответ: D: D На самом деле я никого не дразню.Но в простой логике мы можем сортировать массив в порядке убывания таким способом.Нет необходимости использовать любой тип descriptors или любые другие сложные вещи.И это будет проще для программистов начального уровня.

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