0
Help us understand the problem. What are the problem?

posted at

updated at

配列内のハッシュの平均値の求め方

はじめに

Qiita初投稿です。
プログラミング初心者で、日々の学習ログとして投稿していきたいと思っています。
理解が不十分だったり、誤った記述などがあった際にはご教示いただけると幸いです。

やりたいこと

書籍の情報が入った配列booksが定義されています。

books = [{author: "宮沢賢治", title: "注文の多い料理店", price: 1800}, {author: "芥川龍之介", title: "羅生門", price: 2000}...]

書籍情報の一覧から全金額の平均値を求めたい。
平均は金額の合計を要素の数で割れば良いので、
金額の合計値をどう導き出すか、要素の数はどうすれば取得できるかがわかれば平均値を求めることができそうです。

使用するメソッド

要素数を取得するために使用するメソッドと、要素の合計を取得するために使用するメソッドを先に示します。

length, size

String#length 公式リファレンス
要素数の取得に使用します。
lengthメソッドとsizeメソッドはエイリアスメソッドの関係にあります。つまり、どちらを使っても同じ結果が返ってきます。
文字列.lengthは文字数を返し、配列.lengthは配列の要素数を返してくれます。

sum

Array#sum 公式リファレンス
要素の合計を返すメソッドです。
[1, 2, 3].sum #=> 6
配列内の数値の合計を返してくれます。

[2.5, 3.0].sum(0.0) {|e| e * e } #=> 15.25
ブロックが与えられた場合、加算する前に各要素にブロックが適用されます。
上記の例では、配列に対して、二乗するように指定されているので、
(2.5 * 2.5) + (3.0 * 3.0) が計算されて、15.25という数値が返されています。
ブロック変数は任意の文字を指定することができます。

合計値の求め方

繰り返し処理で合計を求める方法と、上記のsumメソッドを使用する方法があります。

繰り返し処理で値を取り出す方法

total = 0
books.each do |book|
  total += book[:price]
end

配列の中から、一つずつ値を取り出し、変数totalに加算していく方法です。

sumメソッドを使用する方法

books.sum { |book| book[:price] } 

sumメソッドにブロックを与えて、加算する前に:priceの値を取得するように指示しています。
こうすることで、配列に含まれたハッシュ内の値を取り出して加算することができます。

まとめ

平均値を求めたいので、最終的なコードは以下のようになります。

books = [{author: "宮沢賢治", title: "注文の多い料理店", price: 1800}, {author: "芥川龍之介", title: "羅生門", price: 2000}...]
price_average = books.sum { |book| book[:price]} / books.length
puts "平均価格:#{price_average}円"

参考にした記事

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?