2016-12-29 65 views
0

我有一個散列示例,它在Ruby中有兩個元素(section_one和section_two)。我想分別總結每個元素並估計每個元素的平均值。在散列中總結多個數組值 - Ruby

我的哈希:

class_grades = { 
    :section_one => [88, 74, 64], 
    :section_two => [99, 100] 
} 

我對這個代碼試圖

sum = 0 
class_grades.each do |key, value| 
    value.each do |value1| 
    sum += value1 
    end 
    puts "#{key}: #{sum.to_f}" 
end 

但事實證明,結果:

section_one: 226.0 
section_two: 425.0 

我要總結每一個問題元素分開。它估計冷杉元素並繼續。你能幫我解決這個問題嗎?

回答

0

首先,你的代碼的最小編輯:

class_grades.each do |key, value| 
    sum = 0 
    value.each do |value1| 
    sum += value1 
    end 
    puts "#{key}: #{sum.to_f}" 
end 

但我會建議你做點事約:

class_grades.each do |key, value| 
    puts "#{key}: #{value.inject(:+).to_f}" 
end 
+0

謝謝你的快速和可靠的答案! – Syildiz

+0

@Syildiz歡迎您) 您可以將其中一個答案標記爲正確的答案,以幫助他人找到相關問題的解決方案:) –

0

你應該在你的循環

年初設定爲零 sum
class_grades.each do |key, value| 
    sum = 0 
    value.each do |value1| 
    sum += value1 
    end 
    puts "#{key}: #{sum.to_f}" 
end 

有一種更習慣的方式來從可枚舉的

class_grades.each do |key, value| 
    sum = value.inject(0, :+) 
    puts "#{key}: #{sum.to_f}" 
end 

而且,你不需要那個.to_f1 + 2.5得到3.5

class_grades.each do |key, value| 
    sum = value.inject(0, :+) 
    puts "#{key}: #{sum}" 
end 
+0

感謝您快速可靠的回答! – Syildiz

+0

'[88,74,64,0.34] .inject(:+)'的結果是什麼? :) –

+0

你說得對。我更新了代碼:) – Ursus

0

這裏的另一種方式做到這一點:

class_grades.map { |k,v| [k, v.sum.fdiv(v.size).round(1)] }.to_h 
#=> { :section_one => 75.3, :section_two => 99.5 } 

主要方法:Array#sum(> 2.4.0),Integer#fdivFloat#round。有關更多信息,請參閱ruby-doc.org

+0

這個總和來自哪裏?我運行時遇到錯誤。 – Syildiz

+0

這是一個在Ruby 2.4.0中引入的新方法[Array#sum](http://ruby-doc.org/core-2.4.0/Array.html#method-i-sum) –

+0

我太新手了找出單行答案:)謝謝你的幫助! – Syildiz