你能帮助任何人吗?。我有一个哈希值,如下所示。我需要按键值的相反顺序对散列进行排序,并返回同样的散列类型。
我的实际预期输出是(散列)
result = {20111104111221=>[4, 5, 6], 20111104111220=>[7, 8, 9], 20111104110950=>[1, 2, 3]}
# this is my input
irb(main):096:0> h = {20111104111221=>[4, 5, 6], 20111104110950=>[1, 2, 3], 20111104111220=>[7, 8, 9]}
=> {20111104111221=>[4, 5, 6], 20111104110950=>[1, 2, 3], 20111104111220=>[7, 8, 9]}
# It's not correct
irb(main):095:0> Hash[h.sort]
=> {20111104111221=>[4, 5, 6], 20111104110950=>[1, 2, 3], 20111104111220=>[7, 8, 9]}
所以,我试过了。这是正确的,但它是作为数组值返回的,我需要一个作为散列的返回值。
# It's correct but it's not a hash
irb(main):092:0> arr = h.sort_by { |k,v| k }.reverse
=> [[20111104111221, [4, 5, 6]], [20111104111220, [7, 8, 9]], [20111104110950, [1, 2, 3]]]
我再次尝试了数组到哈希的转换。但这是帮助。
# It's also not correct.
irb(main):092:0> irb(main):098:0> Hash[*arr.flatten]
=> {5=>6, 20111104111221=>4, 20111104110950=>1, 2=>3, 8=>9, 20111104111220=>7}
最佳答案
你在用哪个版本的ruby?在1.8中不能排序散列,在1.9中它们是基于插入排序的。这里是more info on that。
考虑到它们处理方式的不同,我不会把重点放在对散列本身进行排序上,而是放在对密钥进行排序并将它们用作引用上,比如:
data = {20111104111221=>[4, 5, 6], 20111104111220=>[7, 8, 9], 20111104110950=>[1, 2, 3]}
keys = data.keys.sort.reverse
keys.each do |key|
puts data[key].pretty_inspect
# ... do work ...
end
这里的调试行只是一个如何访问值的示例。希望这有帮助!