我有一个哈希格式的键"YYYY-MM"
。
我想按升序对哈希进行排序。以下是我想要的:
{"2013-05" => 2 , "2013-06" => 4 , "2013-07" =>10 , ... }
我有一个哈希格式的键"YYYY-MM"
。
我想按升序对哈希进行排序。以下是我想要的:
{"2013-05" => 2 , "2013-06" => 4 , "2013-07" =>10 , ... }
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”将被视为相同,如果您只使用字符串进行排序,情况并非如此。
按键排序也可以:
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}
最简单的方法:
> 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}