it-swarm.com.ru

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

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

[myArray sortedArrayUsingSelector:@selector(compare:)]

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

EDIT: я нашел этот вопрос который предоставляет простой способ отменить итерацию NSArray:

for (id someObject in [myArray reverseObjectEnumerator])

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

34
Jorge Israel Peña

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

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

Еще один способ, IMO, тоже приятно: написать еще один реверс по сравнению с категорией:

@implementation NSNumber (Utility)

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

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

12
vodkhang

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

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

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

6
Peter Hosey

используйте метод sortarrayusingcomparator

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

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

6
Bent El-Eslam

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

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

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

1
gnuchu

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

1
Nava Carmon

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

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

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

0
soorej babu