2013-11-26 67 views
0

這可能是一個簡單的問題,但我不知道如何對有整數值的數組進行排序。使用如何對iOS中的帶符號數字進行排序?

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) 

的符號值

我的數組排序之前,

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

後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'就足夠了。 – 2013-11-26 09:31:52

+0

@ H2CO3比較器必須返回一個'NSComparisonResult'。拳擊只是重用'比較:'的最短途徑。 –

+0

哦,我明白了,對! – 2013-11-26 09:34:59

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

鬼鬼祟祟。+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]; 
    } 

這對我的工作

相關問題