我在按照数组值的长度按降序排序哈希时遇到问题。我有以下哈希:
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 :(得分: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
结构,因此您可以通过调用Hash
(Ruby> = 2.1)或associative_array.to_h
(对于Hash[associative_array]
轻松将其转换为(www|knowledge)\.(example\.com)
所有Ruby版本。)
答案 1 :(得分:0)
您无法对哈希进行排序 - 这可能会导致您的混淆。没有"内部"数组中出现的哈希元素的排序。
你可以,但以某种顺序迭代哈希,例如
hash.sort_by {|k,v| v.length}.reverse.each do |k, v|
puts "k = #{k}, v = #{v}"
end