x と y の値を持つ配列の配列があります。
[[some_date1, 1], [some_date2, 3], [some_date3, 5], [some_date4, 7]]
y
結果は次のようになるように、値 ( 1、3、5、7)のみを合計する必要があります。
[[some_date1, 1], [some_date2, 4], [some_date3, 9], [some_date4, 16]]
これはRubyでどのように可能ですか?
x と y の値を持つ配列の配列があります。
[[some_date1, 1], [some_date2, 3], [some_date3, 5], [some_date4, 7]]
y
結果は次のようになるように、値 ( 1、3、5、7)のみを合計する必要があります。
[[some_date1, 1], [some_date2, 4], [some_date3, 9], [some_date4, 16]]
これはRubyでどのように可能ですか?
はい、これは Ruby で可能です。[map][1]
次のようなものを使用して実行できます。
sum = 0
array.map {|x,y| [x, (sum+=y)]}
これが仕組みです。与えられた入力に対して:
array = ["one", 1], ["two", 2]
配列内の各要素を反復処理します。たとえば、最初の要素は になります["one", 1]
。
次に、その要素 (配列自体) を取得し、変数 x をその配列の最初の要素に割り当てます (eg)"one"
および y を 2 番目の要素 (eg) に割り当てます) 1
。
最後に、次のような結果の配列を返します。
=> ["one", 1], ["two", 3]
マップを使用できます:
a = [[:some_date1, 1], [:some_date2, 3], [:some_date3, 5], [:some_date4, 7]]
sum = 0
a.map { |f, v| [f, (sum = sum + v)]}
=> [[:some_date1, 1], [:some_date2, 4], [:some_date3, 9], [:some_date4, 16]]
sum
最初の繰り返しになるので、それnil
を呼び出す必要がありますto_i
。
a = [['some_date1', 1], ['some_date2', 3], ['some_date3', 5], ['some_date4', 7]]
a.each_cons(2){|a1, a2| a2[1] += a1[1]}
last = 0
arr.map do |a, b|
last = last + b
[a, last]
end
私は使用します:
ary = [['some_date1', 1], ['some_date2', 3], ['some_date3', 5], ['some_date4', 7]]
ary.inject(0) { |m, a|
m += a[-1]
a[-1] = m
}
実行後ary
は次のとおりです。
[["some_date1", 1], ["some_date2", 4], ["some_date3", 9], ["some_date4", 16]]
私がこれを好む理由は、アキュムレータ変数を追加する必要がないからです。inject
値を返しますが、代入なしで破棄されます。