Ruby维护哈希插入顺序

10

我正在寻找一种在Ruby中使用的哈希表保持插入顺序的方法。我的数据来自数据库并已按我想要的方式进行了分组/排序,但是在我的版本1.8.4中,Ruby不能保证哈希表的顺序。

是否有任何解决方法?如果没有,我是否可以创建一个自定义比较器?

这是哈希表:

{
"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个回答

29

像 hash.merge 这样的东西会破坏它,因为许多哈希函数没有被覆盖,这只是一个快速的例子。 - Kimmo Lehto

9
你可以在侧边保持一个按排序顺序排列的键列表。
最初:
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

如果我保持一个按排序顺序排列的键列表,我如何使用它来对哈希进行排序?遍历每个键值对并在不匹配时进行交换? - Hunter McMillen
我刚刚注意到答案的一部分不合理,已将其删除。 - Paweł Obrok
由于@KimmoLehto回答了Ruby 1.9的问题,对于低版本来说,这个答案是好的,但是为了获得更好(约100倍)的性能,请使用链表而不是数组。在这里查看原因:https://web.archive.org/web/20150215021253/http://khakimov.com/blog/2012/05/11/back-to-school-linked-list-with-ruby/ - valk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接