Подтвердить что ты не робот

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

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

[myArray sortedArrayUsingSelector:@selector(compare:)]

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

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

for (id someObject in [myArray reverseObjectEnumerator])

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

4b9b3361

Ответ 1

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

NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"self" 
                                                            ascending: NO];
return [myArray sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]];

Ответ 2

Другим способом, imo, тоже приятно: напишите еще одну обратную ссылку с категорией:

@implementation NSNumber (Utility)

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

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

Ответ 3

Существует несколько способов:

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

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

Ответ 4

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

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

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

Ответ 5

У меня есть 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];

Ответ 6

Для примера данных вот так, и мы хотим сортировать 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);

Ответ 7

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

Ответ 8

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

Ответ 9

Если вам нужно на основе ABCD по возрастанию, используйте следующий код

NSSortDescriptor *descriptor=[[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
NSArray *descriptors=[NSArray arrayWithObject: descriptor];
NSArray *reverseOrder=[yourArray sortedArrayUsingDescriptors:descriptors];

Ответ 10

мы можем сделать это, используя 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 или любые другие сложные вещи. И это будет проще для программистов начального уровня.

Ответ 11

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

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

NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
return [array sortedArrayUsingDescriptors:sortDescriptors];