我有一个名为 的哈希count
,定义为count = {4=>2, 5=>3, 6=>3, 7=>1}
。
我想max
取值,然后将对应于该值的键推入数组,所以我这样做:
array = []
array.push(count.max_by{|k,v| v}[0])
=>> [5]
但是,6
也有 value 3
,这是另一个最大值。如何将此值推送到数组中,以便我得到[5,6]
而不是 just [5]
?
我有一个名为 的哈希count
,定义为count = {4=>2, 5=>3, 6=>3, 7=>1}
。
我想max
取值,然后将对应于该值的键推入数组,所以我这样做:
array = []
array.push(count.max_by{|k,v| v}[0])
=>> [5]
但是,6
也有 value 3
,这是另一个最大值。如何将此值推送到数组中,以便我得到[5,6]
而不是 just [5]
?
这是选择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
这可能会得到显着改善,但在我的脑海中:
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
。除非数据集非常庞大,否则这可能不会带来显着的性能提升,在这种情况下,我的解决方案构建的中间数据结构无论如何都会成为更大的问题。
max = count.values.max
array = count.keys.select{|k| count[k] == max}