sortedArrayUsingComparator int - PullRequest
       1

sortedArrayUsingComparator int

18 голосов
/ 03 июня 2011

У меня есть массив словаря, который 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 и т. Д. Он не рассчитывает величину числа.как я могу это сделать?

Ответы [ 4 ]

18 голосов
/ 03 июня 2011

Не можете ли вы вернуть результат сравнения следующим образом,

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;
    }
}
7 голосов
/ 14 января 2015

Очень короткий способ ответа @ (Дипак Дандупролу)

listPerc = [listItem sortedArrayUsingComparator: ^(id a, id b) {
    NSNumber *first = @([[a objectForKey:@"perc"] intValue]);
    NSNumber *second = @([[b objectForKey:@"perc"] intValue]);
    return [first compare:second];

}

4 голосов
/ 03 июня 2011

Сделайте их объектами NSNumber и сравните их.Сохраните их как NSNumbers для начала (предпочтительный метод) или преобразуйте их при сравнении (медленнее).

Преобразование строки NSSt в NSNumber можно выполнить с помощью:

NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber * myNumber = [f numberFromString:string];
[f release];
0 голосов
/ 17 марта 2012

Может быть, вы можете сделать что-то вроде этого.

- (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...