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 按键排序为浮点数的主要内容,如果未能解决你的问题,请参考以下文章
sklearn-LinearRegression:无法将字符串转换为浮点数:'--'