Ruby维护Hash插入顺序

时间:2011-08-12 13:15:17

标签: ruby hashtable

我正在寻找一种方法来维护我在Ruby中使用的Hash的插入顺序。我的数据来自数据库,并且已经按照我想要的方式进行分组/排序,但Ruby不保证在我的版本1.8.4中保留Hash中的顺序。

这有什么解决方法吗?如果没有,我可以创建自定义比较器吗?

这是哈希:

{
"February"=>[0.5667, 14.6834, 79.7666, 261.8668, 342.1167, 723.517], 
"March"=>[0.0, 26.4667, 554.45, 681.3164, 2376.0668, 10353.0358], 
"May"=>[2.75, 34.6666, 342.1831, 1331.8999, 1589.617, 9282.9662], 
"July"=>[1.9, 2.3666, 59.45, 302.1501, 554.1652, 5195.0839], 
"June"=>[0.15, 24.2166, 244.1498, 335.6834, 536.067, 1498.949], 
"August"=>[0.0, 0.4, 9.3668, 30.7164, 67.7504, 162.0337], 
"April"=>[0.0, 8.3, 68.9331, 357.9168, 815.9662, 2870.217]
 }

任何想法都会很棒, 感谢

2 个答案:

答案 0 :(得分:19)

Ruby自1.9版(2007年12月发布)以来维护了Hash顺序(参见:http://www.igvita.com/2009/02/04/ruby-19-internals-ordered-hash/

此外,对于年龄较大的红宝石,还有一个名为orderedhash的宝石。

答案 1 :(得分:7)

您可以按排序顺序在包含键的一侧保留一个列表

最初:

hash = {}
keys = []
插入时

def insert(key, value)
  keys << key unless hash[key]
  hash[key] = value
end

按插入顺序迭代:

for key in keys do
  puts key, hash[key]
end