>我有以下哈希{"CA"=>2, "MI"=>1, "NY"=>1}
如何使用 ruby 返回最大键值对?我希望它返回"CA"
这将返回最大哈希键值对,具体取决于哈希元素的值:
def largest_hash_key(hash)
hash.max_by{|k,v| v}
end
我发现这样,返回第一个最大值的键
hash.key(hash.values.max)
另一种方式如下:
hash.each { |k, v| puts k if v == hash.values.max }
这贯穿每个键值对,并返回(或在本例中放置)值等于所有值最大值的键。如果存在平局,这应该返回多个密钥。
如果要根据顺序(第二大,最小等)检索多个键值对,更有效的方法是对哈希进行一次排序,然后获得所需的结果。
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
如果您希望返回键值对,可以使用 select 方法:
hash.select {|k,v| v == hash.values.max }
我今天在一个类似的问题上做了这个,结果是这样的:
hash = { "CA"=>2, "MI"=>1, "NY"=>1 }
hash.invert.max&.last
=> "CA"
对于低于 2.3 的 Ruby,您可以将 &.last
替换为 .try(:last)
任何一个都只是在源哈希为空时的一种保护措施:{}
提供的答案假设有一个最大值。但是,它可以有重复项。若要返回最大值的键(包括任何重复项),可以使用以下任一方法:
-
Enumerable#select
; -
Hash#each
# 1: using `Enumerable#select`
def max_value_keys(hash)
max_value = hash.values.max
max_values = hash.select { | key, value | value == max_value }
max_values.keys
end
print max_value_keys({ a: 20, b: 50, c: 30 }) #=> [:b]
print max_value_keys({ a: 20, b: 50, c: 50 }) #=> [:b, :c]
# 2: using `Hash#each`
def max_value_keys(hash)
max_value = nil
keys = []
hash.each do | key, value |
if max_value.nil? || value > max_value
max_value = value
keys = [key]
elsif value == max_value
keys << key
end
end
keys
end
print max_value_keys({ a: 20, b: 50, c: 30 }) #=> [:b]
print max_value_keys({ a: 20, b: 50, c: 50 }) #=> [:b, :c]
为那些有兴趣了解更多信息的人写了一篇博客文章。
这将返回按大小排序的哈希的最后一个键;但是,可能有两个键具有相同的值。
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)