2

我有一个哈希格式的键"YYYY-MM"

我想按升序对哈希进行排序。以下是我想要的:

{"2013-05" => 2 , "2013-06" => 4 , "2013-07" =>10 , ... }
4

3 回答 3

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”将被视为相同,如果您只使用字符串进行排序,情况并非如此。

于 2013-10-30T08:49:16.160 回答
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}
于 2013-10-30T09:08:37.877 回答
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}
于 2013-10-30T09:09:24.620 回答