如何从数组中找到平均值?
如果我有数组:
[0,4,8,2,5,0,2,6]
平均会给我 3.375。
尝试这个:
arr = [5, 6, 7, 8] arr.inject{ |sum, el| sum + el }.to_f / arr.size => 6.5
请注意.to_f,您需要它来避免整数除法的任何问题。你也可以这样做:
.to_f
arr = [5, 6, 7, 8] arr.inject(0.0) { |sum, el| sum + el } / arr.size => 6.5
您可以将其定义Array为另一位评论者建议的一部分,但您需要避免整数除法,否则您的结果将是错误的。此外,这通常不适用于每种可能的元素类型(显然,平均只对可以平均的事物有意义)。但是,如果您想走那条路,请使用:
Array
class Array def sum inject(0.0) { |result, el| result + el } end def mean sum / size end end
如果您以前从未见过inject,它并不像看起来那么神奇。它遍历每个元素,然后对其应用累加器值。然后将累加器交给下一个元素。在这种情况下,我们的累加器只是一个整数,它反映了所有先前元素的总和。
inject
编辑: 评论者 Dave Ray 提出了一个很好的改进。
编辑: 评论者格伦杰克曼的建议,使用arr.inject(:+).to_f,也很好,但如果你不知道发生了什么,可能有点太聪明了。是:+一个符号;当传递给注入时,它将符号命名的方法(在本例中为加法运算)应用于每个元素,以对抗累加器值。
arr.inject(:+).to_f
:+