2012-11-12 217 views
6
陣列

可能重複:
Sorting NSString values as if NSInteger using NSSortDescriptor排序與字符串包含數字

我有一個數組,我充滿了我的NSMutableDictionary ..我用這個:

myArray =[[myDict allKeys]sortedArrayUsingSelector:@selector(IDONTKNOW:)]; 

myDicts的AllKeys是NSStrings ...像123.423或423.343 ...我需要排序新的myArray通過cremental numbers .. 12.234 45.3343 522.533 5432.66 etc etc

必須在@selector中插入什麼才能正確執行此操作?謝謝

+0

看看答案在這裏http://stackoverflow.com/a/38347576/5165668 – OlDor

回答

19

您可以使用NSSortDescriptor並通過doubleValue爲重點。

//sfloats would be your [myDict allKeys] 
NSArray *sfloats = @[ @"192.5235", @"235.4362", @"3.235", @"500.235", @"219.72" ]; 
NSArray *myArray = [sfloats sortedArrayUsingDescriptors: 
        @[[NSSortDescriptor sortDescriptorWithKey:@"doubleValue" 
                ascending:YES]]]; 

NSLog(@"Sorted: %@", myArray); 
5

你不能直接使用sortedArrayUsingSelector:。使用sortedArrayUsingComparator:並自己實現一個比較塊。

有點像這個Q/A:

Changing the sort order of -[NSArray sortedArrayUsingComparator:]

(其實,這個問題的代碼可能可以複製/粘貼到你的代碼,它會「只是工作」,一旦你從integerValue更改到doubleValue四個轉換字符串到數字電話):

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { 
    double n1 = [obj1 doubleValue]; 
    double n2 = [obj2 doubleValue]; 
    if (n1 > n2) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 

    if (n1 < n2) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 

    return (NSComparisonResult)NSOrderedSame; 
}]; 
+0

偉大的答案!拯救我的一天 – DzungPV

0

考慮sortedArrayUsingFunction:。這允許您定義比較元素時使用的自定義比較函數。

myArray =[[myDict allKeys]sortedArrayUsingFunction:SortAsNumbers context:self]; 

NSInteger SortAsNumbers(id id1, id id2, void *context) 
{ 
    float v1 = [id1 floatValue]; 
    float v2 = [id2 floatValue]; 
    if (v1 < v2) { 
     return NSOrderedAscending; 
    } else if (v1 > v2) { 
     return NSOrderedDescending; 
    } 
    return NSOrderedSame; 
} 

更多信息可在這裏:Sort NSArray using sortedArrayUsingFunction

相關問題