我有一个散列,其中包含许多需要按最深值排序的键/值。
这是我正在处理的一个例子:
hash = {"en"=>
{ "key1"=>
{"foo1"=>1,
"foo2"=>2,
"foo3"=>1},
"key2"=>
{"foo4"=>1,
"foo5"=>3,
"foo6"=>2,
"foo7"=>1}
}
"fr"=>
....
}
我想键入每个主键(即“en”、“fr”、es)并按其中键的值排序。因此,“en”和“key1”在最高数字(频率)的顶部。然后对哈希的其余部分执行相同的操作。我不关心键“en”、“fr”等的顺序。
所以我希望输出是这样的:
hash = {"en"=>
{ "key1"=>
{"foo2"=>2,
"foo1"=>1,
"foo3"=>1},
"key2"=>
{"foo5"=>3,
"foo6"=>2,
"foo4"=>1,
"foo7"=>1}
}
"fr"=>
....
}
最佳答案
脆弱,但应该可以工作:
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}}}
关于ruby - 对散列的散列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8950352/