从返回最大值的数组创建哈希映射

时间:2012-12-11 15:36:06

标签: ruby hashmap

我有一系列问题,其中每个问题都有category_idvalue

我希望映射这些内容,以便当哈希中已存在密钥(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来说还是一个新手。

2 个答案:

答案 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]