我有一系列问题,其中每个问题都有category_id
和value
。
我希望映射这些内容,以便当哈希中已存在密钥(category_id
)时,这些值会一起添加。
最后,我想在散列中找到最大的值:
h = Hash.new {|k, v| k[v] = 0}
@test_session.answered_questions.each do |q|
if h.key?(q.category_id)
#add q.value to the value stored in the hash
else
h = { q.category_id => q.value } #insert the "q.category_id" as key and with value "q.value"
end
end
key_with_max_value = h.max_by { |k, v| v }[0] #find the highest value
@result.category = key_with_max_value
@result.score = h[key_with_max_value].value
实现这一点可能有更好的方法,但我对Ruby来说还是一个新手。
答案 0 :(得分:3)
h = Hash.new(0)
@test_session.answered_questions.each {|q| h[q.category_id] += q.value}
@result.category, @result.score = h.max_by { |k, v| v }
哈希值中的每个值都会使用Hash.new(0)
初始化为零,并且由于h.max_by
返回键值对,您可以直接将它们分配给@result
变量。
答案 1 :(得分:1)
您可以这样做:
@test_session.answered_questions.each { |q| h[q.category_id] += q.value }
当一个密钥不存在时,由于您初始化哈希的方式,假设它的值为0
,因此它将插入0 + q.value
。
See the documentation,或尝试一下。
此外,您可以将两个以逗号分隔的变量分配给h.max_by { |k, v| v }
。这称为多重赋值,它也适用于数组:
a,b,c = [1,2,3]