如何在iOS中对已签名的数字进行排序?

时间:2013-11-26 09:27:21

标签: ios iphone objective-c sorting nsarray

这可能是一个简单的问题,但我不知道对有符号整数值数组进行排序的方法。

排序前我的数组,

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)

如何按上述格式排序?提前谢谢。

3 个答案:

答案 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选项无效,因为它不会处理减号 签字作为号码的一部分。

答案 1 :(得分:4)

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

答案 2 :(得分: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];
    }

这对我有用