Сортировка NSArray в порядке убывания
У меня есть NSArray
объектов NSNumber
, которые я успешно отсортировал в порядке возрастания, используя следующее:
[myArray sortedArrayUsingSelector:@selector(compare:)]
Однако мне нужно отсортировать его в порядке убывания. Я полагаю, что compare:
сортируется только в порядке возрастания. Хотя я могу перевернуть NSArray
, мне любопытно, есть ли более простой или эффективный способ сделать это.
РЕДАКТИРОВАТЬ: я нашел этот вопрос, который предоставляет простой способ изменить итерацию NSArray
:
for (id someObject in [myArray reverseObjectEnumerator])
Это прекрасно работает, я думаю, это приятное простое решение, но мне любопытно, есть ли способ указать сортировку в порядке убывания.
Ответы
Ответ 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];