首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在rails中对散列进行排序

在rails中对散列进行排序
EN

Stack Overflow用户
提问于 2013-07-16 07:18:53
回答 2查看 198关注 0票数 0

我有一个哈希,看起来像这样

{"1-5 lbs"=>107342.43999999999, "31+ lbs"=>39838.58000000001, "21-30 lbs"=>19036.41, "11-20 lbs"=>39350.95, "6-10 lbs"=>41401.880000000005}

我想对它进行排序,使其看起来像这样

{"1-5 lbs"=>107342.43999999999, "6-10 lbs"=>41401.880000000005, "11-20 lbs"=>39350.95, "21-30 lbs"=>19036.41, "31+ lbs"=>39838.58000000001 }

逻辑存储在实例变量@weight_ranges

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-16 07:24:56

您需要进入正则表达式来获取每个范围的第一个数字的值。

代码语言:javascript
运行
复制
Hash[(@weight_ranges.sort_by {|key, value| key.scan(/\d+/)[0].to_i})]

要进一步细分,请执行以下操作:

代码语言:javascript
运行
复制
# Sort the weight ranges by the first series of digits found in the key
x = @weight_ranges.sort_by {|key, value| key.scan(/\d+/)[0].to_i}
# Convert each inner Array to a key, value pair in a Hash
x = Hash[x]
票数 3
EN

Stack Overflow用户

发布于 2013-07-16 07:30:10

您将数据描述为散列。对于一个序列,你需要一个配对数组。下面这样的代码就可以做到:

代码语言:javascript
运行
复制
list_of_pairs = @weight_ranges.keys.sort_by(&:to_i).map {|k| [k, @weight_ranges[k]]}

这利用了一个令人高兴的巧合,即to_i在它看到的第一个非数字处停止。

校正

我刚刚了解到,在1.9版本中,Ruby散列是有序的!因此它很容易适应:

代码语言:javascript
运行
复制
Hash[@weight_ranges.sort_by{|k,v| k.to_i}] 

我将这两个想法都留在这里,因为第一个想法仍然适用于Ruby < 1.9。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17665517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档