2016-12-29 41 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