2012-11-12 22 views
6

thể trùng lặp:
Sorting NSString values as if NSInteger using NSSortDescriptorSorting một Array với Strings có chứa số

Tôi có một mảng mà tôi đầy NSMutableDictionary của tôi .. và tôi sử dụng này:

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

AllKeys of myDicts là NSStrings ... như 123.423 hoặc 423.343 ... Tôi cần sắp xếp myArray mới bằng số cremental .. 12.234 45.3343 522.533 5432.66 v.v.

Điều gì phải chèn vào @selector để làm điều này đúng? Cảm ơn

+0

có một cái nhìn tại các câu trả lời ở đây http://stackoverflow.com/a/38347576/5165668 – OlDor

Trả lời

19

Bạn có thể sử dụng một NSSortDescriptor và vượt qua doubleValue như chìa khóa.

//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

Bạn không thể sử dụng quyền tác giả sortedArrayUsingSelector:. Sử dụng sortedArrayUsingComparator: và tự mình thực hiện khối so sánh.

Kinda như q này/A:

Changing the sort order of -[NSArray sortedArrayUsingComparator:]

(Trong thực tế, đó là mã Câu hỏi của khả năng có thể sao chép/dán vào mã của bạn và nó sẽ "chỉ làm việc" một khi bạn thay đổi nó từ integerValue để doubleValue cho bốn cuộc gọi convert-string-to-số):

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

Great câu trả lời! Lưu ngày của tôi – DzungPV

0

Xem xét sortedArrayUsingFunction:. Điều này cho phép bạn xác định hàm so sánh tùy chỉnh để sử dụng khi so sánh các phần tử. Thông tin

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; 
} 

More sẵn ở đây: Sort NSArray using sortedArrayUsingFunction

Các vấn đề liên quan