【问题标题】:Create a hash map from an array that returns the largest value从返回最大值的数组创建哈希映射
【发布时间】: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,您不需要.valueh[key_with_max_value] 将是值。

标签: ruby hashmap


【解决方案1】:
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 变量。

【讨论】:

  • 但是如果我想在添加之前添加一个 if 语句,比如if q.answer == 1,我该怎么做?谢谢你的回答顺便说一句就像一个魅力:)
  • h[q.category_id] += q.value if q.value == 1 如果它只是一个简单的条件。否则,您必须像您的代码一样在 do..end 块中执行此操作。
【解决方案2】:

你可以这样做:

@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]

【讨论】:

  • 哇,这很整洁,但我遇到了语法错误unexpected tPIPE
  • 对不起,删除了。现在再试一次。
猜你喜欢
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多