2013-11-26 5 views
0

Это может быть простой вопрос, но я не знаю способ сортировки массива значащих целочисленных значений.Как отсортировать массив подписанных номеров в iOS?

Мой массив до сортировки,

pointsAry (-2,-7,-5,0,-3,2,-1,-4,1,3,-6) 

После использования

NSArray * sortedArray = [pointsAry sortedArrayUsingComparator:^(id str1, id str2){ 
     return [(NSString *)str1 compare:(NSString *)str2 options:NSNumericSearch]; 
    }]; 

Результат

sortedArray : (-1,-2,-3,-4,-5,-6,-7,0,1,2,3) 

для подписанных значений формат sortedArray не является правильным, так что мне нужно, как

(-7,-6,-5,-4,-3,-2,-1,0,1,2,3) 

Как сортировать, как выше формат? Заранее спасибо.

ответ

4
NSArray *sortedArray = [pointsAry sortedArrayUsingComparator:^(NSString *str1, NSString *str2){ 
    return [@([str1 intValue]) compare:@([str2 intValue])]; 
}]; 
+0

Почему боксировать те в 'NSNumber'? Сравнение 'integerValue' с '' 'оператором является достаточно хорошим. –

+0

@ H2CO3 Компаратор должен вернуть 'NSComparisonResult'. Бокс - это самый короткий способ повторного использования 'compare:'. –

+0

О, я вижу, правильно! –

5

Следующая компаратор позволяет избежать создания временных объектов NSNumber:

NSArray *sortedArray = [pointsAry sortedArrayUsingComparator:^NSComparisonResult(NSString *str1, NSString *str2) { 
    return my_int_compare([str1 intValue], [str2 intValue]); 
}]; 

где

static inline int my_int_compare(int x, int y) { return (x > y) - (x < y); } 

является вспомогательной функцией, которая сравнивает два целых числа и возвращает -1, 0 или + 1 (по требованию для компаратора), используя методику от

Конечно, проблема возникает только потому, что массив содержит NSString объектов. Использование NSNumber s будет лучшим решением.

Использование опции NSNumericSearch не помогает, потому что она не обрабатывает знак минус как часть номера.

+0

Sneaky.+1, хотя я не уверен, что мне нравится обфускация, введенная путем вычисления возвращаемого значения. –

+0

@NikolaiRuhe: Спасибо за отзыв. Возможно, он менее запутан, если вычисление знака перемещается в отдельную функцию (отредактирован ответ). –

+0

Да, это гораздо более читаемо (не могу снова голосовать). –

0
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"P3",@"P1",@"P4",@"P10", nil]; 
    NSMutableArray *num=[[NSMutableArray alloc]init]; 
    for(int i=0;i<array.count;i++) 
    { 
     NSString *str=array[i]; 
     [num addObject: [str substringFromIndex:1]]; 
    } 



    NSArray *sortedArray = [num sortedArrayUsingComparator:^(NSString *str1, NSString *str2){ 
     return [@([str1 intValue]) compare:@([str2 intValue])]; 
    }]; 
    [array removeAllObjects]; 
    for(int i=0;i<sortedArray.count;i++) 
    { 
     NSString *newString = [NSString stringWithFormat:@"P%@",sortedArray[i]]; 


     [array addObject:newString]; 
    } 

Это работа для меня

Смежные вопросы