Question

I want to return a hash key/value pair based on max key value. I know max_by works, but it stops at the first result. How can I return all results in the event of a tie?

{
  foo: 1,
  bar: 3,
  baz: 3
}.max_by { |key, value| value }

#=> [:bar 3] # Only bar comes back, but baz also has a value of 3.
Was it helpful?

Solution

I'd do :

hash = {
         foo: 1,
         bar: 3,
         baz: 3
       }

hash.group_by { |_,value| value }.max_by { |key,_| key }.last
# => [[:bar, 3], [:baz, 3]]

Breaking of the above code :

hash.group_by { |_,v| v } 
# => {1=>[[:foo, 1]], 3=>[[:bar, 3], [:baz, 3]]}
hash.group_by { |_,v| v }.max_by { |k,_| k }
# => [3, [[:bar, 3], [:baz, 3]]]
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top