1. ホーム
  2. ruby-on-rails

[解決済み】Rubyの配列から平均を作成する方法は?

2022-04-08 17:25:50

質問

配列から平均値を求めるには?

配列があれば

[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 これは、整数の除算による問題を避けるために必要なものです。これも可能です。

arr = [5, 6, 7, 8]
arr.inject(0.0) { |sum, el| sum + el } / arr.size
=> 6.5

の一部として定義することができます。 Array しかし、整数の除算を避ける必要があり、そうしないと結果がおかしくなります。また、これは一般的にすべての可能な要素タイプに適用できるわけではありません(明らかに、平均は平均化できるものに対してのみ意味を持ちます)。しかし、もしそのような方法を取りたいのであれば、これを使ってください。

class Array
  def sum
    inject(0.0) { |result, el| result + el }
  end

  def mean 
    sum / size
  end
end

まだご覧になっていない方は inject しかし、これは見た目ほど不思議なものではありません。これは各要素に対して反復処理を行い、アキュムレータの値を適用します。そして、アキュムレータは次の要素に渡されます。この場合、アキュムレータは単純に整数で、前の要素の合計を反映します。

編集する コメンテーターのDave Rayが素敵な改善策を提案してくれました。

編集する。 コメントしたGlenn Jackman氏の提案では arr.inject(:+).to_f も良いのですが、何が起こっているのか分からないと、ちょっと賢すぎるかもしれません。この :+ はシンボルです。injectに渡されると、シンボルで名付けられたメソッド(この場合は加算演算)を、アキュムレータの値に対して各要素に適用します。