2014-04-04 16 views
0

我想創建一個有序哈希鍵的數組。我希望它們在數組和散列中以相同的順序列出。我有這個散列。如何將按鍵推送到未排序的陣列?

h = { "a" => 3, "b" => 1, "c" = 4, "d" = 2 } 

我想要的是這個數組。

arr = ["b", "d", "a", "c"] 

h.sort_by { |k, v| v} 
h.keys 

但返回按字母順序排列的按鍵。我能做些什麼來保持它們按排序哈希的順序?

+0

是我們處理什麼平臺,在這裏? – hd1

+0

哦,對不起!紅寶石。 – caesura

+2

你的問題不清楚。是不是哈希'[「a」,「b」,「c」,「d」]'中的鍵的順序?什麼給了'[「b」,「d」,「a」,「c」]命令?不要期望其他人在各行之間閱讀。用你自己的話表達出來。 – sawa

回答

4

h.sort_by{|k,v| v}會給你[["b", 1], ["d", 2], ["a", 3], ["c", 4]],然後用.map得到密鑰。

h.sort_by{|k,v| v}.map &:first 
0

此代碼

h.sort_by { |k,v| v} 
h.keys 

不起作用,因爲該方法sort_by原始數組不排序,它返回一個新的排序後的數組,其中每個值是從所述原始散列一個(key, value)對:

[["b", 1], ["d", 2], ["a", 3], ["c", 4]] 

如果你使用Ruby 2.1.1,然後你可以只調用to_h陣列上,將鍵/值對重新映射回一哈SH:

h.sort_by { |k, v| v}.to_h.keys 
+0

這將拋出未定義的方法鍵陣列錯誤 – aelor

+0

不完全工作,@Cupcake – hd1

+0

@aelor我更新了我的解決方案,將工作。 –

3
h = { "a" => 3, "b" => 1, "c" => 4, "d" => 2 } 

p h.sort_by(&:last).map(&:first) #=> ["b", "d", "a", "c"] 
+0

這很有趣。在枚舉散列的元素之前,我沒有意識到枚舉器傳遞一個數組''k,v]到塊中,所以'{| k,v | ...'這只是正常的消歧爲陣列。我看到'k,v = hash.first'的工作原理是一樣的。 –

1

你可以試試這個也

h = { "a" => 3, "b" => 1, "c" => 4, "d" => 2 } 
Hash[h.sort_by{|k,v| v}].keys 
#=> ["b", "d", "a", "c"]