2010-09-23 78 views
11

基本上我有一個NSDictionary鍵和值。NSDictionary按鍵作爲浮點數排序

鍵是所有數字,但目前他們是字符串。

我希望能夠將它們作爲數字進行比較以便對它們進行排序。

例如:如果我有這樣的解釋:

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

我希望能夠像這樣排序的:

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

任何想法?

感謝

湯姆

+1

您是否嘗試過使用'sortedArray'NSArray的實例方法之一?如sortedArrayUsingSelector和一個自制的方法,你比較字符串的浮點值 – Jukurrpa 2010-09-23 15:10:16

回答

14

不確定你在做什麼 - 詞典本質上是未排序的,在默認實現中沒有穩定的鍵排序。如果你想排序鍵行走的值,你可以做這樣的事情:

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

這是我想要的:)謝謝。 :)我嘗試從字典中得到'allKeys',但它們仍然是字符串......而且我對分類不太精明。我知道我必須將所有鍵都作爲一個數組來排序,然後按照數組的順序輸出每個鍵,但是我不確定如何對字典的鍵進行排序。謝謝。 – 2010-09-23 15:12:58

+0

只需在floatSort函數的末尾添加一個返回值,以避免可能的編譯器警告 – Vladimir 2010-09-23 15:15:55

+0

@Vladimir:不確定其他編譯器,但至少我的LLVM 1.5足夠聰明地發現函數總是返回一個值。 – zoul 2010-09-23 15:18:00

1

使用compare:options:NSNumericSearch

8

您不能對一本字典,但你可以拿到鑰匙了一個數組,那種,然後在輸出訂購。 sortedArrayUsingComparator會做到這一點,你可以比較字符串與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

這幫了我一個許多。超級緊湊的代碼。我喜歡它!你知道你的東西zpasternack ...或者至少你是一個偉大的複製貼紙。 ;-) – HotFudgeSunday 2011-05-18 18:27:34