3

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でどのように可能ですか?

4

5 に答える 5

3

はい、これは 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]
于 2013-05-02T13:50:41.197 に答える
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

于 2013-05-02T13:57:19.167 に答える
2
a = [['some_date1', 1], ['some_date2', 3], ['some_date3', 5], ['some_date4', 7]]
a.each_cons(2){|a1, a2| a2[1] += a1[1]}
于 2013-05-02T14:37:17.987 に答える
1
last = 0
arr.map do |a, b|
  last = last + b
  [a, last]
end
于 2013-05-02T13:48:44.643 に答える
1

私は使用します:

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値を返しますが、代入なしで破棄されます。

于 2013-05-02T14:13:43.493 に答える