按键将哈希值排序为相反的顺序,在Ruby中返回哈希值

时间:2011-11-04 07:11:10

标签: ruby arrays sorting hash reverse

你能帮助任何人吗?我有一个哈希值如下。我需要按键值以相反的顺序对哈希进行排序,并返回哈希类型。

我的实际预期输出是(哈希)

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}

2 个答案:

答案 0 :(得分:8)

你几乎与h.sort_by...在一起,请不要将它仅仅提供给Hash[]

Hash[h.sort_by { |k,v| -k }]

我还简化了你的排序,否定数字与排序和反转相同。

例如:

>> 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]}
>> Hash[h.sort_by { |k,v| -k }]
=> {20111104111221=>[4, 5, 6], 20111104111220=>[7, 8, 9], 20111104110950=>[1, 2, 3]}

答案 1 :(得分:3)

您使用的是哪个版本的红宝石?在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

调试行就是如何访问您的值的示例。希望这有帮助!

相关问题