128

I have the following hash {"CA"=>2, "MI"=>1, "NY"=>1}

How can I return the maximum key value pair using ruby? I would like it to return "CA"

1
  • 4
    What if there are multiple keys with the same largest value? Commented May 18, 2011 at 6:03

6 Answers 6

263

This will return max hash key-value pair depending on the value of hash elements:

def largest_hash_key(hash)
  hash.max_by{|k,v| v}
end
Sign up to request clarification or add additional context in comments.

5 Comments

worth noting you get back a 2 element array with [key, value]
hash.max_by{ |k,v| v }[0] gives the key.
Also worth noting a tie will go to first in order of position.
You can also do hash.max_by(&:last) for the pair and hash.max_by(&:last).first for the key.
Be warned that this does not work if the hash is empty.
49

I found this way , return the key of the first max value

hash.key(hash.values.max)

1 Comment

While hash[key] is very efficient, hash.key(value) has to search the whole hash. This answer searches the hash twice: first to find the maximum value, then to find the key which matches that value.
14

Another way could be as follows:

hash.each { |k, v| puts k if v == hash.values.max }

This runs through each key-value pair and returns (or in this case puts's) the key(s) where the value is equal to the max of all values. This should return more than one key if there's a tie.

1 Comment

This is a really remarkably inefficient solution, and it's more typing that the other much more efficient solutions.
5

If you want to retrieve more than one key value pair based on order(second largest, smallest etc.), a more efficient way will be to sort the hash once and then get the desired results.

def descend_sort(hash)
   hash = hash.sort_by {|k,v| v}.reverse
end

Key of largest value

puts *hash[0][0]

Get max and min

puts *hash[0], *hash[hash.length-1]

2nd largest key value pair

Hash[*hash[1]]

To convert the hash array back into a hash

hash.to_h

Comments

4

I did this today on a similar problem and ended up with this:

hash = { "CA"=>2, "MI"=>1, "NY"=>1 }

hash.invert.max&.last
=> "CA" 

For Ruby less than 2.3 you can replace &.last with .try(:last) Either one is just a safeguard for if your source hash is empty: {}

Comments

-3

This will return the last key of the hash sorted by size; however, there might be two keys with the same value.

def largest_hash_key(hash)
  key = hash.sort{|a,b| a[1] <=> b[1]}.last
  puts key
end

hash = { "n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0 }
largest_hash_key(hash)

1 Comment

selected answer? may_by is much better than a low-level sort. It's more compact and uses less memory than a sort+last.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.