我的哈希的密钥格式为"YYYY-MM"
。
我想按升序对哈希进行排序。以下是我想要的:
{"2013-05" => 2 , "2013-06" => 4 , "2013-07" =>10 , ... }
答案 0 :(得分:6)
require 'Date'
my_hash = {"2013-10" => 2 , "2013-06" => 4 , "2013-07" =>10}
new_hash = Hash[my_hash.sort_by{|k,_| Date.strptime(k, '%Y-%m')}]
p new_hash # => {"2013-06"=>4, "2013-07"=>10, "2013-10"=>2}
如果您希望输出为数组,请删除Hash []部分。如果使用Ruby< = 1.8.7(在旧版本的Ruby中,哈希没有定义的顺序),你需要这样做。
编辑:有两个原因可以解释为什么通过解析日期而不仅仅是对字符串进行排序。第一个是验证,要检查散列中的日期字符串是否实际上是正确的格式。第二个是它还将处理并正确排序几个月没有添加零。 “2013-06”和“2013-6”将被视为相同,如果您只使用字符串排序则不是这样。
答案 1 :(得分:0)
按键排序也有效:
h = {"2013-10" => 2 , "2013-06" => 4 , "2012-07" =>10}
Hash[h.sort_by{|k,_| k}]
# => {"2012-07"=>10, "2013-06"=>4, "2013-10"=>2}
#which is same as h.sort
Hash[h.sort]
# => {"2012-07"=>10, "2013-06"=>4, "2013-10"=>2}
答案 2 :(得分:0)
最简单的方法:
> h={"2013-10" => 2 , "2013-06" => 4 , "2013-07" =>10 }
=> {"2013-10"=>2, "2013-06"=>4, "2013-07"=>10}
> Hash[h.sort]
=> {"2013-06"=>4, "2013-07"=>10, "2013-10"=>2}