2つの配列があり、それぞれの対応するインデックス番号の要素同士を計算するには、
- transposeメソッド
を使います。
例えば以下の2種類の配列があり、それぞれの対応するインデックス番号同士でarray_aの要素からarray_bの要素を引いて新しい配列を作りたいとします。
array_a = [4, 2, 9]
array_b = [3, 6, 5]
#それぞれの対応するインデックス番号同士で引き算したい
=> (4-3), (2-6), (9-5)
#期待する結果
[1, -4, 4]
Rubyではtransposeメソッドを使えば、この処理をたった1行で実現できます。
result = [array_a, array_b].transpose.map{|ary| ary.inject(:-) } #たったこれだけでOK
p result #=> [1, -4, 4]
【ちょっと解説】
array_a = [4, 2, 9]
array_b = [3, 6, 5]
# ①2つの配列を1つの配列の中に入れて2重配列を作る
[array_a, array_b]
=> [[4, 2, 9], [3, 6, 5]]
# ②ここでインデックス番号が同じ同士を配列で括る
[array_a, array_b].transpose
=> [[4, 3], [2, 6], [9, 5]]
# ③上記で括った配列の中身をinjectメソッドを使って計算
[array_a, array_b].transpose.map{|ary| ary.inject(:-) }
=> [1, -4, 4]
Rubyは痒いところに手が届くようなメソッドがピンポイントでありますよね。
ちなみに、injectメソッドの引数を変えれば足し算、掛け算、割り算も可能ですよ。
# 足し算
[array_a, array_b].transpose.map{|ary| ary.inject(:+) }
=>[7, 8, 14]
# 掛け算
[array_a, array_b].transpose.map{|ary| ary.inject(:*) }
=>[12, 12, 45]
# 割り算
[array_a, array_b].transpose.map{|ary| ary.inject(:/) }
=> [1, 0, 1]
1行で完結できるのは本当に便利ですね。