【发布时间】:2012-12-11 15:36:05
【问题描述】:
我有一系列问题,每个问题都有一个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 还是很陌生。
【问题讨论】:
-
Hash.new(0)等价于Hash.new { |h,k| h[k] = 0 }并且更加简洁。只有空数组和散列等共享对象才需要长格式。 -
rohit89 的回答很好,但您自己的代码中只需要几个 cmets 以供将来查找。
h = { q.category_id => q.value }实际上不会在现有散列中插入条目,它会将h替换为仅包含一个键的新散列。要向现有哈希添加条目,请使用[]表示法。即h[q.category_id] = q.value。同样对于@result.score,您不需要.value。h[key_with_max_value]将是值。