ruby - 对散列的散列进行排序

标签 ruby sorting hash

我有一个散列,其中包含许多需要按最深值排序的键/值。

这是我正在处理的一个例子:

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/

相关文章:

ruby-on-rails - 如何在 Rails 4 中使用参数初始化事件记录?

ruby - 制作环境变量的索引哈希

ruby - 如何在 Ruby 中打乱数组/哈希?

python - 从列表中删除已存在的元素并仅在列表中保留该值的一个元素

javascript - 如何计算 git 树哈希?

md5 - 我可以使用 md5 防止重复内容吗?

ruby - ruby 中的 TCPServer,代码卡住了

javascript - 通过比较具有不同键值对的对象对 Javascript 数组进行排序

arrays - 如何获取 CGPoint 数组的每个值重复的次数

python - Python 中的 CARP 哈希