Reputation: 21877
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"
Upvotes: 128
Views: 95628
Reputation: 511
I found this way , return the key of the first max value
hash.key(hash.values.max)
Upvotes: 49
Reputation: 1368
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: {}
Upvotes: 4
Reputation: 335
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
Upvotes: 5
Reputation: 173
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.
Upvotes: 14
Reputation: 9167
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
Upvotes: 263
Reputation: 42865
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)
Upvotes: -3