按值的长度排序哈希值(降序)

时间:2015-09-11 15:09:34

标签: ruby sorting hash

我在按照数组值的长度按降序排序哈希时遇到问题。我有以下哈希:

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

我做得不对?有什么想法吗?

2 个答案:

答案 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]
# }

使用HashEnumerable#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