在Ruby中将最大散列键值推入数组?

时间:2013-11-06 02:20:31

标签: ruby-on-rails ruby hash maxby

我有一个名为count的哈希,定义为count = {4=>2, 5=>3, 6=>3, 7=>1}

我想取max值,然后将与该值对应的键推送到数组中,所以我这样做:

array = []
array.push(count.max_by{|k,v| v}[0])

=>> [5]

但是,6也具有值3,这是另一个最大值。如何将此值推入数组,以便[5,6]而不仅仅是[5]

3 个答案:

答案 0 :(得分:2)

这是选择哈希的max值的方法:

count.values.max
=> 3

在哈希上使用select方法:

count.select{ |k, v| v == count.values.max }
 => {5=>3, 6=>3}

获取钥匙:

count.select{ |k, v| v == count.values.max }.keys
 => [5, 6]

最后分配给一个数组:

array = count.select{ |k, v| v == count.values.max }.keys

答案 1 :(得分:1)

这可能会有很大的改善,但不在我的头顶:

count.group_by{|k,v| v}.max_by{|k,v| k}.last.map(&:first)

首先,对散列的键/值对进行分组,使具有相同值的那些在同一组中:

count.group_by{|k,v| v} #=> {2=>[[4, 2]], 3=>[[5, 3], [6, 3]], 1=>[[7, 1]]}

然后获取具有最大值的组:

 .max_by{|k,v| k} #=> [3, [[5, 3], [6, 3]]]

现在,我们只想要原始密钥,所以首先我们采用该对的最后一个元素:

  .last #=> [[5, 3], [6, 3]]

我们只想要每个嵌套对的第一个元素:

  .map(&:first) #=> [5, 6]

与基于select的解决方案相比,此方法避免了一次通过地图。除非数据集真的很大,否则它可能不是一个重要的性能胜利,在这种情况下,我的解决方案构建的中间数据结构无论如何都会成为一个问题。

答案 2 :(得分:0)

max = count.values.max
array = count.keys.select{|k| count[k] == max}