Сортировка NSSortDescriptor с номером в виде строки?
Получил массив, полный словаря, понравившийся этому:
(
{ order = "10";
name = "David"
};
{ order = "30";
name = "Jake";
};
{ order = "200";
name = "Michael";
};
)
Когда я использую NSSortDescriptor, как приведенный ниже код, он сортируется только по первому char, а 200 - ниже 30. Я могу, конечно, изменить объект "order" в NSNumber вместо строки, и он будет работать, Но есть ли способ отсортировать строку как значения int без изменения исходного объекта?
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"norder" ascending:YES];
[departmentList sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];
Update:
Благодаря bandejapaisa.
Вот рабочая версия для 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];
Ответы
Ответ 1
Может быть, сортировка выполняется вместо компаратора или один из других методов сортировки:
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];
}];
Ответ 2
Использование NSNumber является излишним. Вы можете сэкономить много накладных расходов, выполнив следующие действия:
NSArray *sortedArray = [someArray sortedArrayUsingComparator:^(id obj1, id obj2) {
return (NSComparisonResult) [obj1 intValue] - [obj2 intValue];
}];
Ответ 3
Все вышеперечисленные методы нуждаются в хороших знаниях в основах для реализации, но для свежего я предлагаю самый простой способ использовать метод нативного блока, надеюсь, что это поможет
NSArray* sortedArr =[fetchResults sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
int aValue = [[a valueForKey:@"subgroupId"] intValue];
int bValue = [[b valueForKey:@"subgroupId"] intValue];
return aValue>bValue; }];
Счастливое кодирование...