2015-09-11 60 views
1

我遇到問題,按數組值的長度以降序排序哈希。我有以下散列:按值的長度排序哈希值(降序)

hash = { 
    "1" => [0,3], 
    "2" => [0,2], 
    "3" => [1,2,3,4], 
    "4" => [1,8,7,6,5], 
    "5" => [7,8], 
    "10" => [5] 
} 

我想按照以下順序對它進行排序:4,3,1,2,5,10。

hash.sort_by {|k,v| v.length}.reverse 

我在做什麼不對?有任何想法嗎?

+0

這裏工作正常! :/ – nersoh

+0

@nersoh我試着運行它,它給了我5,4,3,2,1,10雖然5只有長度爲2 :( – user2765163

+0

爲什麼急於選擇一個答案?急於判斷可能會阻止其他,有時候會更好,回答,對於那些仍在準備答案的人來說,imo是無禮的,我建議至少等上幾個小時,不要忘記,新成員往往沒有意識到你可以對他們自己的問題的答案投票,一旦給出,可以撤銷對勾或將其重新分配給不同的答案 –

回答

0

不能排序哈希 - 這可能會導致你的困惑。散列元素在數組中出現時沒有「內部」排序。

可以,然而,迭代在一定的順序散列,例如,

hash.sort_by {|k,v| v.length}.reverse.each do |k, v| 
    puts "k = #{k}, v = #{v}" 
end 
+0

應該注意,hash.sort_by的結果是一個數組而不是一個散列 – evotopid

+1

「散列的元素沒有」內部「排序作爲它出現在一個數組中「。這是不正確的。從1.9開始,Ruby在Hashes中實現了保持插入順序的排序。* Hashes枚舉它們的值的順序是插入相應的鍵。*(直接來自[Hash文檔](ht tp://ruby-doc.org/core-1.9.3/Hash.html)for 1.9.3)你清楚地表明你可以通過使用Enumerable#sort_by將它轉換爲一個'Enumerator'來排序一個Hash,它將返回一個關聯的數組(帶有一個塊)。然後,該數組可以輕鬆地轉換回散列並保留請求的排序。 – engineersmnky

+0

@engineersmnky:你說得對。無論如何,在大多數使用情況下,爲了排序而創建第二個散列是不需要的,我猜。 – claasz

3

看來你正在尋找Enumerable#sort_by這樣的(作注,這可能是hash.sort_by {|_,v| -v.length}.to_h取決於Ruby的版本。我用Hash[]因爲它的兼容性)。

Hash[hash.sort_by {|_,v| -v.length}] 
#=> 
# { 
# "4"=>[1, 8, 7, 6, 5], 
# "3"=>[1, 2, 3, 4], 
# "1"=>[0, 3], 
# "2"=>[0, 2], 
# "5"=>[7, 8], 
# "10"=>[5] 
# } 

排序一個Hash使用Enumerable#sort_by當與塊稱爲將返回的[[key,value],[key,value],...]關聯數組(否則它返回一個Enumerator)。由於Hash瞭解關聯Array結構,因此可以通過調用associative_array.to_h(Ruby> = 2.1)或Hash[associative_array](適用於所有Ruby版本)輕鬆地將此變回Hash

+1

很好的答案。醜陋的格式。 –

+0

@CarySwoveland @sawa照顧了我:)。儘管我討厭使用'hash'作爲局部變量名稱,因爲它已經在Object的上下文中具有一種含義 – engineersmnky