0

各質問に と がある一連の質問があり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 にまったく慣れていません。

4

2 に答える 2

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

于 2012-12-11T15:52:48.927 に答える
1

あなたは簡単に行うことができます:

@test_session.answered_questions.each { |q| h[q.category_id] += q.value }

キーが存在しない場合0、ハッシュを初期化した方法により、値が であると想定されるため、 で挿入され0 + q.valueます。

ドキュメントを参照するか、試してみてください。

また、コンマで区切られた 2 つの変数を に割り当てることもできますh.max_by { |k, v| v }。これは多重代入と呼ばれ、配列でも機能します。

a,b,c = [1,2,3]
于 2012-12-11T15:49:22.640 に答える