NSSortDescriptor сортировать с номером в виде строки? - PullRequest
11 голосов
/ 30 марта 2012

Получил массив словаря, как это:

(
   { order = "10";
     name = "David"
   };
   { order = "30";
     name = "Jake";
   };
   { order = "200";
     name = "Michael";
   };
)

Когда я использую NSSortDescriptor, как и приведенный ниже код, он сортирует только по первому символу, поэтому 200 меньше 30. Я, конечно, могу изменить объект "order" на NSNumber вместо строки, и это будет работать. Но есть ли способ отсортировать строку как значения int без изменения исходного объекта?

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"norder"  ascending:YES];
[departmentList sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];

Обновление:

Благодаря Бандехапайсе.

Вот рабочая версия для iOS 5 (Xcode, где компилирование).

NSArray *sortedArray;
sortedArray = [departmentList sortedArrayUsingComparator:(NSComparator)^(id a, id b) {
    NSNumber *num1 = [NSNumber numberWithInt:[[a objectForKey:@"norder"] intValue]];
    NSNumber *num2 = [NSNumber numberWithInt:[[b objectForKey:@"norder"] intValue]];

    return [num1 compare:num2];
}];
departmentList = [sortedArray mutableCopy];

Ответы [ 3 ]

10 голосов
/ 30 марта 2012

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

NSArray *sortedArray = [someArray sortedArrayUsingComparator:^(id obj1, id obj2) {
    return (NSComparisonResult) [obj1 intValue] - [obj2 intValue];
}];
7 голосов
/ 30 марта 2012

Возможно сортировка с использованием компаратора или одного из других методов сортировки:

NSArray *sortedArray = [someArray sortedArrayUsingComparator:^(id obj1, id obj2) {
  NSNumber *num1 = [NSNumber numberWithInt:[obj1 intValue]];
  NSNumber *num2 = [NSNumber numberWithInt:[obj2 intValue]];
  return (NSComparisonResult)[rank1 compare:num2];
}];
0 голосов
/ 26 июля 2016

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

NSArray* sortedArr =[fetchResults sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {

int aValue = [[a valueForKey:@"subgroupId"] intValue];
int bValue = [[b valueForKey:@"subgroupId"] intValue];

return aValue>bValue; }];

Счастливое кодирование ...

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