Search

検索したいワードを入力してください

2019年02月19日

Rubyで配列を結合する6つの方法をまとめて紹介

「Rubyで作った配列を結合したい、でも微妙に中身が違うからどのメソッドを使えば良いかわからない」この記事では、そんな時どのメソッドを使うのが最適か実例を挙げながら説明しています。Rubyの配列結合方法を理解したい方は、読んでみてください。

Rubyにおける配列の結合とは

プログラミング言語「Ruby」で開発を始めると、複数の配列が作られます。しかし、その都度配列を選び直し、取り出すのでは手間と時間がかかります。そこで複数の配列を結合する方法を紹介し、どの場面でどのメソッドを使うべきか説明します。

Rubyのその他の配列操作に関する記事はこちら
Rubyの配列の要素や配列自体を削除する方法
Rubyの配列から要素を検索する方法
Rubyの配列の要素数を数える方法
Rubyの配列を並び替える(ソート)方法
Rubyの配列を初期化する方法
Rubyで配列要素を追加する方法

6つのメソッドでRubyの配列を結合する

Rubyで配列を結合する場合、pushメソッド、concatメソッド、joinメソッド、flattenメソッド、+演算子、<<演算子という6つの代表的なメソッドがあります。

それぞれ使用方法や使う場面が異なりますので、今回は配列eastern_cityと配列western_cityを例にとり、それぞれのメソッドを紹介していきます。

pushメソッドで配列を結合する方法

Rubyで配列に要素を加える際に使用したpushメソッドは配列同士の結合にも使用できます。

このメソッドを配列eastern_cityと配列western_cityの結合に利用してみましょう。

eastern_city = ["Tokyo", "Yokohama", "Sapporo", "Kawasaki", "Saitama", "Sendai"]
western_city = ["Osaka", "Nagoya", "Fukuoka", "Kobe", "Kyoto", "Hiroshima"]
japan = eastern_city.push(western_city)
p japan
#→ ["Tokyo", "Yokohama", "Sapporo", "Kawasaki", "Saitama", "Sendai", ["Osaka", "Nagoya", "Fukuoka", "Kobe", "Kyoto", "Hiroshima"]]

pushメソッドの使い方

Rubyで配列同士を結合する前に、まずは要素を配列に加える際のpushメソッドを確認しましょう。

a = [1, 2, 5]
a.push(9)
p a
#→ [1, 2, 5, 9]が表示される

配列同士の結合も同じく考え、array1.push(array2)として、array1に配列名そしてarray2に追加する配列名を入れることでメソッドが使えます。

ここで、先程の使用例を確認しましょう。pushメソッドで結合した後に代入されたjapanでは、western_cityが配列のまま配列eastern_cityの中に入っています。

flattenメソッドを使う事や、western_cityの前に*を付与する事でこれを解消できますが、ここで大事なのはarray1.push(array2)は[..array1の中身.., [array2]]となってしまう事です。このことを失念すると後々混乱するので注意してください。

concatメソッドで配列を結合する方法

Rubyのpushメソッドを使用した場合、配列の中にそのまま配列が入ってしまうことは先ほど説明しました。ここで、p japan.lengthとすると要素数は7が示されます。

しかし、今回eastern_cityとwestern_cityは並列の存在であり、12の都市があるので、p japan.lengthは12が示される必要があります。

そこで、配列の中にそのまま配列が入ってしまう問題をconcatメソッドを使用することで解消することができます。

japan = eastern_city.concat(western_city)
p japan
#→ ["Tokyo", "Yokohama", "Sapporo", "Kawasaki", "Saitama", "Sendai", "Osaka", "Nagoya", "Fukuoka", "Kobe", "Kyoto", "Hiroshima"]

concatメソッドの使い方

以上、Rubyのconcatメソッドを使うと配列のまま相手の配列に入るのではなく、配列の各要素が相手の配列に加えられることがわかります。つまり、array1.concat(array2)とすることで、[(array1の各要素),(array2の各要素)]とすることができます。

joinメソッドで配列を結合する方法

今度は先程の2例とは少し異なる例を紹介していきます。例えば、文章の一部を各単語に分割し、配列に入れたと仮定します。その際、Rubyのjoinメソッドを利用すれば、配列に入っている各単語を文字列にすることが可能です。
例1
word = ["Hello", "I", "am", "Taro", "!"]
p word.join(" ")
#→ "Hello I am Taro !"

例2
food = [["meat", "chicken"], ["onion", "potato"]]
p food.join(",")
#→ "meat,chicken,onion,potato"
food.join("-")
p food
#→ [["meat", "chicken"], ["onion", "potato"]]

joinメソッドの使い方

Rubyのjoinメソッドはarray.join("文字列")とすることで配列の各要素に対して、入力した文字列で結合し、その作られた文字列を返すことができます。例1では、配列wordに対して空白の文字列を入力することで各単語をスペースでつなぎ、一つのテキストの文字列が完成しています。

例2のように、配列の中に配列が入っている場合でも、それを全て取り除き、各要素が「,」で区切られて文字列として返すことができます。

大変便利なメソッドですが、例2の後半部分を見ると、pの後でしかjoinのメソッドは使われず、その後は当初の配列に戻っていることがわかります。joinメソッドはpもしくはputsの後にのみ使えることを理解しておきましょう。

flattenメソッドで配列を結合する方法

Rubyで一方の配列を他方の配列に入れる場合はpushメソッド、そして一方の配列の各要素を他の配列に入れる場合はconcatメソッドを使用するということは前述しました。

それでは、既に配列の中に入ってしまった配列から各要素を取り出して他の配列要素と並べることはできないでしょうか。

実はflattenメソッドを使うことで配列の中の配列を展開して一つの配列にまとめることができます。
例3
blood_type = [["A", "B", "O"], "AB"]
p blood_type.flatten → ["A", "B", "O", "AB"]
p blood_type
#→ [["A", "B", "O"], "AB"]

例4
blood_type = [["A", "B", "O"], "AB"]
p blood_type.flatten! → ["A", "B", "O", "AB"]
p blood_type
#→ ["A", "B", "O", "AB"]

flattenメソッドの使い方

Rubyのflattenメソッドは、対象となる配列を「平坦化」します。上述した例では配列blood_typeに対して["A", "B", "O"]という配列と"AB"の要素が入っております。

ここでは、flattenメソッドを使うことで配列blood_typeが平坦化され、["A","B","O","AB"]と全ての要素が同じ配列上にあることがわかります。

ここで、flattenメソッドを使用する際に注意すべき点があります。例3では、pの後にflattenメソッドを使用した行でしかflattenの結果が出ていないことがわかります。

配列自体を書き換えたい場合は、例4を参考にarray.flatten!としてください。flattenの後に!を付け加えることがポイントで、これを破壊的メソッドと言います。他にも破壊的メソッド使用例がありますので、ここで覚えておきましょう。

+演算子で配列を結合する

Rubyで配列を結合するためにここまで4つのメソッドを紹介してきました。それぞれ特徴が異なりますが、一気に多くのメソッドを覚えることは大変です。

そこで、ここからはより簡単に、そして覚えやすいメソッドを紹介していきます。文字列の結合で使われた+演算子を配列の結合にも使用できます。ここで、文字列の結合を復習しておきましょう。

city = "横浜" + "市"
p city
#→ "横浜市"


複数の文字列を+でつなぐことで一つの文字列とすることができました。
これを応用して配列をつなげていきましょう。


各配列は省略
japan = eastern_city + western_city
p japan
# → ["Tokyo", "Yokohama", "Sapporo", "Kawasaki", "Saitama", "Sendai", "Osaka", "Nagoya", "Fukuoka", "Kobe", "Kyoto", "Hiroshima"]

+演算子の使い方

Rubyでは、+演算子を使えば、メソッド名を覚えずとも配列を結合することができます。array1 + array2として使うことを覚えておいてください。

さらに、実は既出のarray1.concat(array2)と同じ結果になっていることが例をみるとわかります。+演算子はconcatメソッドの効果を発生させています。ただし、以下注意点があります。

even = [1, 3, 5]
odd = [2, 4, 6]
p even + odd #→ [1, 3, 5, 2, 4, 6]
p even #→ [1, 3, 5]
p odd.concat(even) #→ [1, 3, 5, 2, 4, 6]
p odd #→ [1, 3, 5, 2, 4, 6]


+演算子を利用してもその後evenの中身は変わりませんが、concatメソッドを使用した後はevenが結合後の配列に変わっています。+演算子と異なり、concatメソッドは破壊的メソッドであることを覚えておきましょう。

<<演算子で配列を結合する方法

最後に、<<演算子を紹介します。Rubyでは、<<演算子を使うことで配列に新しい要素を加えることができました。

array = [1, 2, 4, 7]
array << 8
p array
#→ [1, 2, 4, 7, 8]


配列に対しても<<演算子を使うことで、結合することができます。既出の配列eastern_cityと配列western_cityを例に見ていきましょう。

japan = eastern_city << western_city
p japan
#→ ["Tokyo", "Yokohama", "Sapporo", "Kawasaki", "Saitama", "Sendai", ["Osaka", "Nagoya", "Fukuoka", "Kobe", "Kyoto", "Hiroshima"]]

<<演算子の使い方

Rubyでは、<<演算子を使用した場合、配列の中に配列が入ります。そのため、pushメソッドと同じ効果があることに着目してください。

また、+演算子と異なり、一度このメソッドを使うとeastern_cityは結合後の配列に変わることを覚えておきましょう。

6つのメソッドを使い分けましょう

以上、Rubyで配列を結合するためには6つのメソッドがあることを説明しました。特に、2つの演算子は覚えやすく使い勝手が良いです。

また、メソッドによって破壊的メソッドとそうではないものがありました。ここを混同してしまうと、結合したはずのメソッドが結合されていない場合が発生します。

<<演算子やpushメソッドは配列の中に配列が入ってしまうため、敬遠したくもなります。しかし、今回のjapan配列の例で言うと、配列の中でそのまま東日本と西日本を分けておきたい場合に空のjapan配列を作っておき、各配列をpushすることで有効活用できます。

上記の違いを確認する上でも、まずは各メソッドをご自分のPCで一度打ち込んでみてください。各メソッドの違いを楽しむことがRubyの更なる理解につながります。

Rubyのその他の配列操作に関する記事はこちら
Rubyの配列の要素や配列自体を削除する方法
Rubyの配列から要素を検索する方法
Rubyの配列の要素数を数える方法
Rubyの配列を並び替える(ソート)方法
Rubyの配列を初期化する方法
Rubyで配列要素を追加する方法

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related