2011-11-04 76 views
2

您能否幫助任何人?我有一個哈希值如下。我需要按鍵值以相反的順序排序哈希,並返回哈希類型。按鍵排序哈希值爲反向順序,在紅寶石中返回哈希值

我的實際期望的輸出是(散)

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} 

回答

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 

調試線在那裏只是如何訪問你的價值的一個例子。希望這可以幫助!

+0

謝謝@Matt。它爲我工作。 –

+1

爲1.8的東西+1。 –

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]} 
+0

謝謝@mu。這不適合我。第二個語句返回h的原始值。 –

+0

@ Mr.Black:您使用1.8? –

+0

是的,我使用紅寶石1.8.7版本。 –