Ruby
Rails

Rubyで複数の配列を1つの配列に結合するために色々やってみた

More than 3 years have passed since last update.

Ruby初心者です。

複数の配列を1つの配列に結合しようとしたら意外にできなかったので、同じように困っている人に役立ったら嬉しいです★

追記:公開早々、たくさんのアドバイス&ご指摘を頂き、修正をいたしました。
   コメントに記載されている情報も順次追加していきます!

結合の方法を色々やってみる

1.pushメソッド

pushメソッドは、結合と言えば1番に出てくる方法ですね。
挙動としては、

配列の末尾に引数を要素として追加します

になります。

ということで、実際にやってみますね!

— まずは配列に要素を追加する

まずは、結合の前に要素の追加をしてみますね。

array = [1, 2, 3]
array.push(10, 100)
p array
[1, 2, 3, 10, 100]

よく見る感じですね。

— 配列に配列を結合する

今回の記事のポイントである
『複数の配列を1つの配列に結合する』
という内容ですね!

array1 = [1, 2, 3]
array2 = [10, 100]

array1.push(array2)
p array1
[1, 2, 3, [10, 100]]

あぁ!!連想配列みたいになってしまった…!
って事になりました。

とっても悲しい状態ですね…。

そこで、こいつを解決できないかなーーーっと探した結果!

flattenメソッドを使うと解決できる!

私は初めて知ったのですが、flattenメソッドを使うと
あっさりと解決できました★

array1 = [1, 2, 3]
array2 = [10, 100]

array1.push(array2)
array1.flatten!
p array1
[1, 2, 3, 10, 100]

とっても幸せですね♡!

もちろん、3つ以上の配列でも大丈夫です!

array1 = [1, 2, 3]
array2 = [10, 100]
array3 = ["a", "bb", "abc"]

array1.push(array2).push(array3)
# array1 = [1, 2, 3, [10, 100], ["a", "bb", "abc"]]
array1.flatten!
p array1
[1, 2, 3, 10, 100, "a", "bb", "abc"]

※ちなみにflattenメソッドってなに?

flatten, flatten! (Array) - Rubyリファレンス - AmiWikiによると…

配列の配列を平坦化した新しい配列を返します。配列中に含まれる配列からすべて要素を取り出して、親の配列の中に並べます。

つまり、親配列に、配列の全ての要素を並べるんですね。
結果、1次配列になるということですね。
(flattenはflatからきてるという事に、いま書いてて気付きましたw)

もう少し見て行くと、引数を指定することで何段階までを親配列に並べるかを設定できるみたいです。

この辺の詳細はflatten, flatten! (Array) - Rubyリファレンス - AmiWikiを見ていただければと思います。

2.<< 演算子

こちらも配列の結合や追加でよくみるメソッドかなと思います。
<< 演算子pushメソッドと挙動が一緒で、

配列の末尾に引数を要素として追加します

になるんですね。

— 複数の配列を1つの配列に結合する

pushメソッドと挙動が一緒なので、複数の配列を結合する場合も同様にflattenを使うと幸せになれます!

array1 = [1, 2, 3]
array2 = [10, 100]

array1 << array2
# array1 = [1, 2, 3, [10, 100]]
array1.flatten
p array1
[1, 2, 3, 10, 100]

3.+ 演算子

こちらは<< 演算子と挙動が近いと思ったのですが、実は結構違いがありました!

2つの配列を連結した新しい配列を作成して返します

ということで、複数は複数でも2つに限定した処理になります。

しかし、算数の足し算と同じように考えると複数の配列にも対応できるのが分かるかと思います★

では実際にやってみますね!

— 複数の配列を1つの配列に結合する

array1 = [1, 2, 3]
array2 = [10, 100]
array3 = ["a", "bb", "abc"]

array1 = array1 + array2 + array3
p array1
[1, 2, 3, 10, 100, "a", "bb", "abc"]

簡単に『複数の配列を1つの配列に結合する』ことができました!

4.concatメソッド

こちらのconcatメソッドが今回紹介する最後の方法になります。

配列arrayの末尾に引数の配列other_arrayを結合します

お!?これは理想の挙動っぽい!
と説明を読むと感じます!!!

ということで、実際にやってみますね★

— 複数の配列を1つの配列に結合する

array1 = [1, 2, 3]
array2 = [10, 100]

array1.concat(array2)
p array1
[1, 2, 3, 10, 100]

やっぱり理想通りに動いてくれました!
幸せですね♡!

ではでは、
3つ以上の複数の配列の場合も見てみましょう!

array1 = [1, 2, 3]
array2 = [10, 100]
array3 = ["a", "bb", "abc"]

array1.concat(array2).concat(array3)
p array1
[1, 2, 3, 10, 100, "a", "bb", "abc"]

1つの配列に結合することができました!

ただ、concatメソッドは、引数1つのみなので
array1.concat(array2, array3)
みたいな書き方はできないです。

おわりに

Rubyはまだまだ初心者で、たかが複数の配列を結合するだけでも、地味に時間がかかりました…。

この4つのメソッドたちで、どれが適しているかなど分からないことがたくさんありますが、分かりやすくてシンプルなコードを目指して頑張ります!

長くなりましたが、以上で『Rubyで複数の配列を1つの配列に結合する方法』でした!
ありがとうございました。

参考サイト

Rubyリファレンスhttp://ref.xaio.jp/ruby