2016-12-29 152 views
1

我有一個散列,其中的鍵是整數,值是字符串數組。我需要按字母順序對數組中的項進行排序,並將排序後的數組作爲新的散列值。對散列值進行排序

我認爲像hash.map{ |k,v| v.sort }會工作,但沒有。只是要一點更加明確,我需要打開:

hash = { 0 => ["c", "d", "b", "a"], 1 => ["e", "q", "x", "m"] } 

到:

hash = { 0 => ["a", "b", "c", "d"], 1 => ["e", "m", "q", "x"] } 

回答

4

這是一種方式:

hash.each_value { |v| v.sort! } 
#=> {0=>["a", "b", "c", "d"], 1=>["e", "m", "q", "x"]} 

或更簡潔:

hash.each_value(&:sort!) 

但是,如果你想保留原始哈希做這樣的:

hash.map { |k,v| [k,v.sort] }.to_h 
#=> {0=>["a", "b", "c", "d"], 1=>["e", "m", "q", "x"]} 
+1

不錯。從來不知道有'each_value'方法。 – Santhosh

+0

將此更改爲接受的答案b/c徹底性。 #each_value(&:sort!)可能是最寶貴的方法。謝謝。 –

2

試試這個,

hash.each { |k,v| v.sort! } 

此排序就地陣列。

+0

我曾嘗試過#each方法,但我猜測爆炸!是重要的一點。謝謝。 –

0

這不會發生變異原始散列。

hash.merge(hash) { |*,n| n.sort } 
    #=> {0=>["a", "b", "c", "d"], 1=>["e", "m", "q", "x"]} 

如果原始散列要被修改,替換merge!(又名update)爲merge

這使用Hash#mergeHash#merge!的形式,它們使用一個塊來確定存在於兩個正被合併的哈希中的鍵的值,這裏是原始哈希的所有鍵。有關詳細信息,請參閱文檔。

相關問題