2010-09-23 33 views
11

về cơ bản tôi có một từ điển NSD với các khóa và giá trị.Sắp xếp NSDictionary theo các phím là phao

Các khóa là tất cả các số, nhưng tại thời điểm chúng là chuỗi.

Tôi muốn để có thể so sánh chúng như số để sắp xếp chúng.

ví dụ: Nếu tôi có một từ điển như thế này:

{ 
    "100" => (id)object, 
    "20" => (id)object, 
    "10" => (id)object, 
    "1000" => (id)object, 
} 

Tôi muốn để có thể sắp xếp nó như thế này:

{ 
    "10" => (id)object, 
    "20" => (id)object, 
    "100" => (id)object, 
    "1000" => (id)object, 
} 

Bất kỳ ý tưởng?

Cảm ơn

Tom

+1

Bạn đã thử sử dụng một trong các phương pháp thể hiện của 'ClassifiedArray' NSArray chưa? Chẳng hạn như sortArrayUsingSelector và một phương pháp tự chế, nơi bạn so sánh giá trị float của chuỗi – Jukurrpa

Trả lời

14

Không chắc những gì bạn đang lên đến - từ điển được vốn đã được phân loại, không có trật tự chính ổn định trong việc thực hiện mặc định. Nếu bạn muốn đi bộ các giá trị của phím được sắp xếp, bạn có thể làm một cái gì đó như thế này:

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

NSArray *allKeys = [aDictionary allKeys]; 
NSArray *sortedKeys = [allKeys sortedArrayUsingFunction:floatSort context:NULL]; 
for (id key in sortedKeys) 
    id val = [aDictionary objectForKey:key]; 
    … 
+0

đây là những gì tôi muốn :) cảm ơn bạn. :) Tôi đã cố gắng lấy 'allKeys' từ từ điển, nhưng chúng vẫn là dây ... và tôi không quá hiểu biết về phân loại. Tôi biết tôi phải lấy allKeys như một mảng, sắp xếp và sau đó xuất ra từng mảng theo thứ tự của mảng, nhưng tôi không chắc chắn cách sắp xếp các khóa của từ điển. cảm ơn bạn. –

+0

chỉ cần thêm một sự trở lại vào cuối chức năng floatSort để tránh cảnh báo trình biên dịch có thể – Vladimir

+0

@Vladimir: Không chắc về trình biên dịch khác, nhưng ít nhất LLVM tôi 1,5 là đủ thông minh để hình dung ra rằng chức năng luôn luôn trả về một giá trị. – zoul

1

Sử dụng compare:options: với NSNumericSearch.

8

Bạn không thể sắp xếp một cuốn từ điển, nhưng bạn có thể nhận được các phím như một mảng, sắp xếp, sau đó đầu ra trong đó gọi món. sortArrayUsingComparator sẽ làm điều đó, và bạn có thể so sánh các chuỗi với tùy chọn NSNumericSearch.

NSArray* keys = [myDict allKeys]; 
NSArray* sortedArray = [keys sortedArrayUsingComparator:^(id a, id b) { 
    return [a compare:b options:NSNumericSearch]; 
}]; 

for(NSString* aStr in sortedArray) { 
    NSLog(@"%@ has key %@", [myDict objectForKey:aStr], aStr); 
} 
+0

này đã giúp tôi một nhiều. Siêu nhỏ gọn mã. Tôi thích nó! Bạn biết zpasternack công cụ của bạn ... hoặc ít nhất bạn là bản sao tuyệt vời-paster. ;-) – HotFudgeSunday

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