NSDictionary 按键排序为浮点数

Posted

技术标签:

【中文标题】NSDictionary 按键排序为浮点数【英文标题】:NSDictionary sort by keys as floats 【发布时间】:2010-09-23 15:04:28 【问题描述】:

基本上我有一个带有键和值的 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,

有什么想法吗?

谢谢

汤姆

【问题讨论】:

您是否尝试过使用 'sortedArray' NSArray 的实例方法之一?例如 sortedArrayUsingSelector 和一个比较字符串浮点值的自制方法 【参考方案1】:

不确定您在做什么——字典本质上是未排序的,默认实现中没有稳定的键顺序。如果你想通过排序的键来遍历值,你可以这样做:

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];
    …

【讨论】:

这就是我想要的 :) 谢谢。 :) 我尝试从字典中获取allKeys,但它们仍然是字符串......而且我对排序不太了解。我知道我必须将 allKeys 作为一个数组,对其进行排序,然后按数组的顺序输出每个,但我不确定如何对字典的键进行排序。谢谢。 只需在 floatSort 函数末尾添加一个 return 即可避免可能的编译器警告 @Vladimir:不确定其他编译器,但至少我的 LLVM 1.5 足够聪明,可以确定函数总是返回一个值。 好的,这是一个问题——它不允许我使用嵌套函数。我应该把这个函数放在哪里使它不嵌套?或者我可以把它变成一个类方法并使用sortUsingSelector:@selector(method:) 只要把它放在你的方法之间,它就可以正常工作了。【参考方案2】:

您无法对字典进行排序,但您可以将键作为数组获取,对其进行排序,然后按该顺序输出。 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 );

【讨论】:

这对我帮助很大。超级紧凑的代码。我喜欢它!你知道你的东西 zpasternack ......或者至少你是伟大的复制粘贴者。 ;-)【参考方案3】:

compare:options:NSNumericSearch 一起使用。

【讨论】:

以上是关于NSDictionary 按键排序为浮点数的主要内容,如果未能解决你的问题,请参考以下文章

如何从张量转换为浮点数

无法将数组转换为浮点数python

sklearn-LinearRegression:无法将字符串转换为浮点数:'--'

ValueError:无法将字符串转换为浮点数:'GIAC'

在 Swift 中将半精度浮点数(字节)转换为浮点数

将十六进制转换为浮点数