如何找到最大哈希值的键?


110

我有以下哈希 {"CA"=>2, "MI"=>1, "NY"=>1}

如何使用ruby返回最大键值对?我希望它返回“ CA”


3
如果有多个具有相同最大值的键怎么办?
加布

Answers:


230

这将返回最大哈希键值对,具体取决于哈希元素的值:

def largest_hash_key(hash)
  hash.max_by{|k,v| v}
end

49
值得注意的是,您使用[key,value]返回了一个2元素数组
justingordon 2014年

6
hash.max_by {| k,v | v} [0]给出密钥。
nfriend21 2014年

4
同样值得注意的是,平局将按位置顺序排在第一位。
罗比·吉尔福伊

8
您还可以为该对执行hash.max_by(&:last),并为密钥执行hash.max_by(&:last).first。
mahemoff


16

另一种方法可能如下:

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

这遍历每个键值对,并返回(或在这种情况下,是看跌期权的)键,该键的值等于所有值的最大值。如果有平局,这应该返回多个键。


5

如果要返回键值对,则可以使用select方法:

hash.select {|k,v| v == hash.values.max }

4

如果要根据顺序(第二大,最小等)检索多个键值对,则一种更有效的方法是将哈希排序一次,然后获得所需的结果。

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

最大价值的关键

puts *hash[0][0]

获得最大和最小

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

第二大键值对

Hash[*hash[1]]

将哈希数组转换回哈希

hash.to_h

1

我今天在一个类似的问题上做了这个,结果是这样的:

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

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

对于低于2.3的Ruby,您可以替换&.last.try(:last) Either,这是源哈希为空的一种保护措施:{}


-3

这将返回按大小排序的哈希的最后一个键;但是,可能有两个键具有相同的值。

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)

2
选择答案?may_by比低级排序要好得多。与sort + last相比,它更紧凑并且使用的内存更少。
tokland 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.