2016-12-29 9 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(&:sort!) 

:簡潔

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

以上

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ため(別名updatemerge!を代用。

Hash#mergeHash#merge!のフォームを使用して、両方のハッシュがマージされているキーの値を決定します。これは元のハッシュのすべてのキーです。詳細については、ドキュメントを参照してください。