Search code examples
rubyhashmaxby

Ruby hash: return keys with highest value


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.

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]]]