2017-09-30 3 views

答えて

2

これを行うには2つの方法があります。

arr = [[ '01-01-2001', 4 ], [ '01-01-2001', 5 ], [ '01-01-2001', 6 ], [ '01-02-2001', 7]] 

使用Enumerable#group_by

arr.group_by(&:first).transform_values { |v| v.sum(&:last).fdiv(v.size) } 
    #=> {"01-01-2001"=>5.0, "01-02-2001"=>7.0} 

Hash#transform_valuesArray#sumNumeric#fdivを参照してください。この方法は、の値を決定するためにブロックを使用Hash#update(別名merge!)の形式を使用し

arr.group_by(&:first) 
    #=> {"01-01-2001"=>[["01-01-2001", 4], ["01-01-2001", 5], ["01-01-2001", 6]], 
    # "01-02-2001"=>[["01-02-2001", 7]]} 

使用Hash#update

最初のステップは、グループに日付要素であります両方のハッシュに存在するキーがマージされます。

arr.each_with_object({}) do |(k,v), h| 
    h.update(k=>[v, 1]) { |_k, (otot, onbr), (ntot, nnbr)| [otot+ntot, onbr+1] } 
end.transform_values { |tot, nbr| tot.fdiv(nbr) } 

がマージされ、両方のハッシュに含まれる各キーの値を返すブロックに使用される三つのブロック変数を説明するためのドキュメントを参照してください。ハッシュhは、別個の日付ストリングごとに、第1の値が所与の日付の合計値であり、第2の値がその日付のオカレンスである2要素配列を含む。もちろん、すべての値の積算値を維持することは、group_byメソッドのように、すべての値の配列を維持するよりも、スペース効率が向上します。

Rubyではをh.update({ k=>[v, 1] })の略語として許可しています。

関連する問題