2010-09-23 51 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