您好我正在尝试查找哈希值中的最大值。 我在谷歌搜索了一下,我找到了这段代码:
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)
在此代码中“puts”打印最大的键和值e.x y300。 那么,我如何修改代码以找到最大值并将其键入to_s变量?
答案 0 :(得分:8)
这是O(n):
h = {"n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0}
key_with_max_value = h.max_by { |k, v| v }[0] #=> "y"
答案 1 :(得分:4)
这是另一种做你想做的事情。这将找到具有最大值的所有键:
h = {"n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0, "z" => 300}
max = h.values.max
output_hash = Hash[h.select { |k, v| v == max}]
puts "key(s) for the largest value: #{output_hash.keys}"
#=>key(s) for the largest value: ["y", "z"]
答案 2 :(得分:1)
您可以将方法的第一个语句修改为
key = hash.sort{|a,b| a[1] <=> b[1]}.last[0]
Hash.sort
返回一组键值对。 last
为您提供具有最大值的键值对。它的第一个元素是相应的键。
答案 3 :(得分:0)
对哈希值进行一次排序,而不是查找最大值。这样你也可以得到最小的等等。
def reverse_sort_hash_value(hash)
hash = hash.sort_by {|k,v| v}.reverse
end
h = reverse_sort_hash_value(h)
最大值的关键
max = *h[0][0]
获取最小值的键/值
puts *h[h.length-1]
您可以使用Hash[h.select { |k, v| v == max}]
或使用h.to_h
答案 4 :(得分:0)
我认为使用你在google上找到的东西并调整它直到它以某种方式运行它并不是一个好主意。如果我们开发软件,我们应该做一些我们理解的事情。
哈希被优化为按键查找值。它未针对值排序或按值的属性进行查找进行优化。所以数据结构对你的问题没有帮助。其他数据结构如树或甚至数组可能更好。
但是如果你因为其他一些原因想要使用哈希,当然有可能。不知何故,你只需要遍历整个哈希。
算法非常简单:遍历整个哈希并检查值是否更大以及之前的最大值:
max_value = 0 # or -Infinity if you have negative values
key_for_max_value = nil
hash.each_pair do | key, value |
if value > max_value
max_value = value
key_for_max_value = key
end
end
puts "The largest value is #{max_value} and it is has the key #{key_for_max_value}"
其他一些解决方案使用类似排序的技巧,但这只会隐藏复杂性。