2016-03-24 49 views
1

排序我有此數組:如何哈希鍵通過它們的價值在紅寶石2.3.0

data = [ 
    ['Frank', 33], 
    ['Stacy', 15], 
    ['Juan', 24], 
    ['Dom', 32], 
    ['Steve', 24], 
    ['Jill', 24] 
] 

我拿了這一點,把它變成一個哈希這樣我會有它通過關鍵字和值來組織,這樣他們會更容易單獨打電話。這結束了給我這個

{"Frank"=>33, "Stacy"=>15, "Juan"=>24, "Dom"=>32, "Steve"=>24, "Jill"=>24} 

我知道爲了只看到我需要做的data.keys鍵和做data.keys.sort我得到按字母順序排列的按鍵。

我假設我需要做類似data.keys.sort_by { |key, value| value }的事情,但每當我運行時,我都會按原始順序接收散列鍵。

+0

由於您有重複的密鑰,因此很難以編程方式進行。否則,像data.to_h.map {| k,v | v} .sort.map {| vv | {h.key(vv)=> vv}}會起作用。 – jjk

+0

當你的值相同時應該發生什麼? –

+0

是啊...爲了清楚起見,data.to_h.map {| k,v | v} .sort.map {| vv | {h.key(vv)=> vv}}將會工作,除了__values__重複,不是鍵。 – jjk

回答

2

你不能改變一個哈希的順序,但你可以把它變成一個哈希之前對數組進行排序:

data = [ 
    ['Frank', 33], 
    ['Stacy', 15], 
    ['Juan', 24], 
    ['Dom', 32], 
    ['Steve', 24], 
    ['Jill', 24] 
] 

hash = data.sort_by(&:last).to_h 
# => { "Stacy" => 15, 
#  "Juan" => 24, 
#  "Steve" => 24, 
#  "Jill" => 24, 
#  "Dom" => 32, 
#  "Frank" => 33 } 

如果你已經有一個哈希值,那麼你就必須把它到數組中,然後對其進行排序,然後將其重新轉換爲散列,例如hash.to_a.sort_by(&:last).to_h

+0

知道的很好,謝謝!通過做 - 哈希= data.sort_by {|鍵,值|值} .to_h它也將它們排序爲正確的順序。謝謝。這非常有幫助! – ParkerCP

+0

這不是問的問題......問題是如何按鍵排序鍵值。 – jjk

+0

@jjk你說得對。我已經更新了我的答案。 –

1

此外,

如何紅寶石2.3.0通過自己的價值散列關鍵字進行排序?

,如果你有一個像

hash = {"Frank"=>33, "Stacy"=>15, "Juan"=>24, "Dom"=>32, "Steve"=>24, "Jill"=>24} 

哈希然後,散列可以簡單地通過keysvalues排序,但這會給你一個arrayarrays可以轉化爲雖然哈希值。

hash.sort_by{|x,y| y}.to_h 
# => {"Stacy"=>15, "Juan"=>24, "Steve"=>24, "Jill"=>24, "Dom"=>32, "Frank"=>33} 

對於嵌套哈希

people = { 
    :fred => { :name => "Fred", :age => 23 }, 
    :joan => { :name => "Joan", :age => 18 }, 
    :pete => { :name => "Pete", :age => 54 } 
} 

people.sort_by { |k, v| v[:age] } 
# => [[:joan, {:name=>"Joan", :age=>18}], 
#  [:fred, {:name=>"Fred", :age=>23}], 
#  [:pete, {:name=>"Pete", :age=>54}]] 

通過這種方式,我們甚至可以排序的:名字關鍵,如果我們這樣選擇。