0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ruby 複数の配列を結合する

Posted at

はじめに

配列は要素に別の配列を持つことができるので、

[1,2,3,[4,5,6],7,8,9]
とか
[[1,2,3],[4,5,6],[7,8,9]]

みたいな形の配列を作ることができます。
元々別々の配列を上記のように一つの配列にする場合、配列を結合・追加するメソッドや演算子はたくさんあります。

  • push
  • <<
  • +
  • concat
  • unshift

ですが、色々使っていたら混乱してきました。
しかも使い方が少しずつ違うようですのでいくつか試してみましたのでこちらにまとめます。

1. pushメソッド

pushメソッドは配列の最後尾に要素の一つとして指定された値を追加します。

a = [1,2,3]
b = [4,5,6],[7,8,9]
c = [10,11,12],[13,14,15]

a.push(b)
=> [1, 2, 3, [[4, 5, 6], [7, 8, 9]]]
b.push(a)
=> [[4, 5, 6], [7, 8, 9], [1, 2, 3]]
b.push(c)
=> [[4, 5, 6], [7, 8, 9], [[10, 11, 12], [13, 14, 15]]]

追加する配列が複数であってもレシーバーの配列の要素一つ分になるようです。
なのでb = [4,5,6],[7,8,9][[4,5,6],[7,8,9]]として最後尾に追加されています。

また、pushメソッドは破壊的メソッドです。レシーバーは値が変更されます。

a.push(b)
=> [1, 2, 3, [[4, 5, 6], [7, 8, 9]]]

a
=> [1, 2, 3, [[4, 5, 6], [7, 8, 9]]]

2. <<演算子

<<演算子はpushメソッドと同じ動作のようです。

a = [1,2,3]
b = [4,5,6],[7,8,9]
c = [10,11,12],[13,14,15]

a << b
=> [1, 2, 3, [[4, 5, 6], [7, 8, 9]]]
b << a
=> [[4, 5, 6], [7, 8, 9], [1, 2, 3]]
b << c
=> [[4, 5, 6], [7, 8, 9], [[10, 11, 12], [13, 14, 15]]]

同じですね!
破壊的メソッドであるという点も同じです。

a << b
=> [1, 2, 3, [[4, 5, 6], [7, 8, 9]]]

a
=> [1, 2, 3, [[4, 5, 6], [7, 8, 9]]]

3. + 演算子

+演算子は追加する配列の要素を一つずつ追加します。

a = [1,2,3]
b = [4,5,6],[7,8,9]
c = [10,11,12],[13,14,15]
d = [-1,-2,-3]

a + b
=> [1, 2, 3, [4, 5, 6], [7, 8, 9]]
b + a
=> [[4, 5, 6], [7, 8, 9], 1, 2, 3]
b + c
=> [[4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]]
a + d
=> [1, 2, 3, -1, -2, -3]

aの配列では要素は数値一つ一つですので、値が最後尾に追加されていきます。
bの配列では要素は配列一つ一つですので、配列のまま最後尾に追加されていきます。

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

としたい場合には

[a] + b
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

というようにa自体を配列の要素としてあげれば良さそうです。

+演算子は値に変更を加えません。

a + b
=> [1, 2, 3, [4, 5, 6], [7, 8, 9]]

a
=> [1, 2, 3]

4.concatメソッド

concatメソッドは+演算子とほとんど同じ動作をします。

a = [1,2,3]
b = [4,5,6],[7,8,9]
c = [10,11,12],[13,14,15]
d = [-1,-2,-3]

a.concat(b)
=> [1, 2, 3, [4, 5, 6], [7, 8, 9]]
b.concat(a)
=> [[4, 5, 6], [7, 8, 9], 1, 2, 3]
b.concat(c)
=> [[4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]]
a.concat(d)
=> [1, 2, 3, -1, -2, -3]

同じです。

[a].concat(b)
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

配列の要素として扱う方法もこちらでも有効です。

ただし、concatメソッドは破壊的メソッドです。

a.concat(b)
=> [1, 2, 3, [4, 5, 6], [7, 8, 9]]

a
=> [1, 2, 3, [4, 5, 6], [7, 8, 9]]

ここが+演算子との違いですね。

おまけ.unshiftメソッド

unshiftメソッドはpushメソッドによく似ています。

  • pushメソッドは最後尾に追加します。
  • unshiftメソッドは先頭に追加します。
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

この形を作りたい場合+演算子等でのやり方を載せましたが、unshiftメソッドを使っても実現できます。

a = [1,2,3]
b = [4,5,6],[7,8,9]

b.unshift(a)
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

さいごに

配列を配列のまま結合する方法をまとめた記事を見つけられなかったので、自分でまとめてみました。
間違い等ありましたら教えてください。

0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?