SortedArrayUsingComparator int
У меня есть массив словаря, который он sortedArrayUsingComparator сортирует их на основе ключа;
listPerc = [listItem sortedArrayUsingComparator: ^(id a, id b) {
NSString *first = [a objectForKey:@"perc"];
NSString *second = [b objectForKey:@"perc"];
return [first compare:second];
проблема заключается в том, что этот ключ является числом, а порядок - например: 1,10, 15, 17, 2, 23 и т.д.
он не вычисляет величину числа.
как я могу это сделать?
Ответы
Ответ 1
Сделайте их в объекты NSNumber и сравните их. Либо сохраните их как NSNumbers, чтобы начать (предпочтительный метод) или преобразовать их при сравнении (медленнее).
Преобразование NSString в NSNumber может быть выполнено с помощью
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber * myNumber = [f numberFromString:string];
[f release];
Ответ 2
Не можете ли вы вернуть результат сравнения следующим образом:
listPerc = [listItem sortedArrayUsingComparator: ^(id a, id b) {
int first = [[a objectForKey:@"perc"] intValue];
int second = [[b objectForKey:@"perc"] intValue];
if ( first < second ) {
return (NSComparisonResult)NSOrderedAscending;
} else if ( first > second ) {
return (NSComparisonResult)NSOrderedDescending;
} else {
return (NSComparisonResult)NSOrderedSame;
}
}
Ответ 3
Очень короткий путь ответа @(Deepak Danduprolu)
listPerc = [listItem sortedArrayUsingComparator: ^(id a, id b) {
NSNumber *first = @([[a objectForKey:@"perc"] intValue]);
NSNumber *second = @([[b objectForKey:@"perc"] intValue]);
return [first compare:second];
}
Ответ 4
Может быть, вы можете сделать что-то подобное.
- (void)setPlaces:(NSArray *)places
{
if(_places != places)
{
_places = [places sortedArrayUsingComparator:^(id obj1, id obj2){
return [[obj1 objectForKey:FLICKR_PLACE_NAME] caseInsensitiveCompare:[obj2 objectForKey:FLICKR_PLACE_NAME]];
}];
[self.tableView reloadData];
}
}
Я сделал что-то, что было между вами и выше, и это работает:
- (void)setPlaces:(NSArray *)places
{
if(_places != places)
{
_places = [places sortedArrayUsingComparator:^(id a, id b){
NSString *first = [a objectForKey:FLICKR_PLACE_NAME];
NSString *second = [b objectForKey:FLICKR_PLACE_NAME];
return [first caseInsensitiveCompare:second];
}
];
if (self.tableView.window) [self.tableView reloadData];
} //if _places
} //set