2012-01-21 10 views
2

私は、最も深い値でソートする必要があるいくつかのキー/値を含むハッシュを持っています。私は、各メインキー(すなわち「EN」、「FR」、ES」)をキーにしたいハッシュのハッシュを並べ替える

hash = {"en"=> 
    { "key1"=> 
     {"foo1"=>1, 
     "foo2"=>2, 
     "foo3"=>1}, 
     "key2"=> 
     {"foo4"=>1, 
     "foo5"=>3, 
     "foo6"=>2, 
     "foo7"=>1} 
    } 
"fr"=> 
    .... 
} 

とソートのキーの値によって:ここ

は、私が取り扱っておりますの例です"en"を持っていて、 "key1"が最も高い数字(周波数)を持つ "value2"を持つようにして、残りのハッシュに対して同じことをする。 "EN"、 "FR" など

だから私は、出力はこのような何かになりたい:

hash = {"en"=> 
    { "key1"=> 
     {"foo2"=>2, 
     "foo1"=>1, 
     "foo3"=>1}, 
     "key2"=> 
     {"foo5"=>3, 
     "foo6"=>2, 
     "foo4"=>1, 
     "foo7"=>1} 
    } 
"fr"=> 
    .... 
} 
+0

だからここでハッシュですか? –

+0

質問は何ですか?そして、あなたは何を書いていますか? –

+0

^^^ ..ハッシュ['en'] [:key]を各キーの値でソートしたい – Domness

答えて

2

脆弱が、動作するはずです:

def sort_deep(h) 
    if h.values.all?{ |o| o.is_a? Numeric } 
    Hash[ h.sort_by{|k,v|[-v,k]} ] 
    else 
    Hash[ h.map{ |k,v| [ k, sort_deep(v) ] } ] 
    end 
end 

証明:

hash = {"en"=> 
    { "key1"=> 
     {"foo1"=>1, 
     "foo2"=>2, 
     "foo3"=>1}, 
     "key2"=> 
     {"foo4"=>1, 
     "foo5"=>3, 
     "foo6"=>2, 
     "foo7"=>1} 
    }, 
"fr"=> 
    { "key1"=> 
     {"foo1"=>91, 
     "foo2"=>22, 
     "foo3"=>12}, 
     "key2"=> 
     {"foo4"=>21, 
     "foo5"=>31, 
     "foo6"=>27, 
     "foo7"=>11} 
    } 
} 
require 'pp' 
pp sort_deep(hash) 
#=> {"en"=> 
#=> {"key1"=>{"foo2"=>2, "foo1"=>1, "foo3"=>1}, 
#=> "key2"=>{"foo5"=>3, "foo6"=>2, "foo4"=>1, "foo7"=>1}}, 
#=> "fr"=> 
#=> {"key1"=>{"foo1"=>91, "foo2"=>22, "foo3"=>12}, 
#=> "key2"=>{"foo5"=>31, "foo6"=>27, "foo4"=>21, "foo7"=>11}}} 
関連する問題