Search

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

2019年02月19日

Rubyで配列要素を追加する3つの方法を紹介【初心者向け】

Ruby初心者の方が最初につまずくポイントとして、配列の追加方法が分からないということがあるのではないでしょうか?今回はRubyで配列の要素を後から追加する際に、どう書けばいいか、pushメソッド、unshiftメソッド、<

配列要素の追加とは

配列の追加とは、配列のある位置に、新たな要素を加えることです。これは、配列をスタックやキューとして用いる場合に行われます。

配列の先頭を取出し口とするとき、スタック(LIFO)として使う場合は、先頭に追加することでプッシュ(push)ができます。一方、キュー(FIFO)として使う場合は、末尾に追加することでエンキュー(enqueue))ができます。

Rubyで配列に要素を追加する方法

Rubyでは、要素数に応じて配列の長さは自動で調整されます。よって、C言語のように、自分でメモリを確保したり、要素の追加によって、ずれた要素をすべてコピーしたりする必要はありません。

要素の追加は、Arrayクラスのメソッドや演算子一つで可能となっています。

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

Rubyのpushメソッドを使った配列要素の追加

配列に要素を追加する1つ目の方法は、Array#pushメソッドを用いる方法です。配列の先頭を取出し口としたキューとして利用する場合、新たに要素を追加するエンキューとして利用することができます。

pushメソッドとは

Array#pushメソッドとは、配列の末尾に要素を追加するメソッドです。引数を複数指定して追加することもできます。以下のRubyスクリプトに例を示します。

fruits=%w(Apple Banana Orange)
fruits.push("Grape")
p fruits #=> ["Apple", "Banana", "Orange", "Grape"]
fruits.push("Peach","Pineapple")
p fruits #=> ["Apple", "Banana", "Orange", "Grape", "Peach", "Pineapple"]

Rubyのunshiftメソッドを使った配列の追加

配列に要素を追加する2つ目の方法は、Array#unshiftメソッドを用いる方法です。配列の先頭を取出し口としたスタックとして利用する場合、新たに要素を追加するプッシュとして利用することができます。

unshiftメソッドとは

Array#unshiftメソッドとは、配列の先頭に要素を追加するメソッドです。追加に伴い、各要素のインデックスは自動で調整されます。

引数を複数指定して追加することもできます。以下のRubyスクリプトに例を示します。配列fruitsにGrape、そのあとPeachとPineappleを追加するコードです。

fruits=%w(Apple Banana Orange)

fruits.unshift("Grape")
p fruits #=> ["Grape", "Apple", "Banana", "Orange"]

fruits.unshift("Peach","Pineapple")
p fruits #=> ["Peach", "Pineapple", "Grape", "Apple", "Banana", "Orange"]

<<演算子を使った配列の追加

配列の末尾へ要素を追加するには、1つ目で紹介したArray#pushメソッドを使う他に、<<演算子を使用する方法があります。ただし、これには一度に追加できる要素の数に、pushメソッドとの違いがあります。

<<演算子とは

<<演算子では、pushメソッドと同じく、末尾への要素の追加を行います。ただし、一つの要素しか追加できないという点が異なります。以下のRubyスクリプトに例を示します。

fruits=%w(Apple Banana Orange)
fruits<<"Grape"

p fruits #=> ["Apple", "Banana", "Orange", "Grape"]

先頭や末尾でなくても要素の追加はできる

Rubyでは、配列の要素が存在しなくても、添字を用いて任意のインデックスに代入できます。この場合、配列は自動的に拡張され、その要素との間はすべてnilが代入されます。

nums=[3,1,4,1,5,9,2]
nums[nums.length+3]=5
p nums #=>[3, 1, 4, 1, 5, 9, 2, nil, nil, nil, 5]

Rubyで配列のデータを結合するには?

一つ一つの要素ではなく、別の配列のデータをすべて追加したい場合は、Array#concatメソッド、または+=演算子を用います。2つの配列は+演算子で結合することができます。
fruits=%w(Apple Banana Orange)

fruits.concat(%w(Grape Peach))
p fruits #=> ["Apple", "Banana", "Orange", "Grape", "Peach"]

fruits+=%w(Pineapple Melon)
p fruits #=> ["Apple", "Banana", "Orange", "Grape", "Peach", "Pineapple", "Melon"]

+演算子を単独で用いると、配列の内容を変更しないで(非破壊的に)追加することができます。一時的に配列に要素を追加して参照したい場合に利用できます。

fruits=%w(Apple Banana Orange)
puts (fruits+%w(Grape Peach)).join(", ") #=> Apple, Banana, Orange, Grape, Peach
p fruits #=> ["Apple", "Banana", "Orange"]

誤ってpush/unshiftメソッドや、<<演算子を用いた場合、配列そのものが追加されるので注意しましょう。

fruits=%w(Apple Banana Orange)

fruits.push(%w(Grape Peach))
fruits<<%w(Pineapple Melon)
fruits.unshift(%w(Lemon Kiwi))

p fruits#=> [["Lemon", "Kiwi"], "Apple", "Banana", "Orange", ["Grape", "Peach"], ["Pineapple", "Melon"]]

既にある要素は追加したくない場合は?

配列の|=(OR)演算子を使用して、論理和をとります。配列を集合とみなして追加するので、既に存在する場合は追加されません。

fruits=%w(Apple Banana Orange Grape Lemon)
fruits|=%w(Kiwi Pineapple Grape Melon Lemon)
p fruits #=> ["Apple", "Banana", "Orange", "Grape", "Lemon", "Kiwi", "Pineapple", "Melon"]

Rubyで配列を他の変数に代入するときの注意

配列を別の変数に代入する時、配列の内容ではなく、オブジェクトIDがコピーされるため、元の配列を変更したのに合わせて代入した配列も変更されてしまいます。

言語によってはコピーした配列は変更が反映されない仕様のものもあるので、注意しましょう。

nums1=[0,0,0,0]
nums2=nums1
p nums1.object_id==nums2.object_id #=> true
nums1.push(3)
p nums1 #=> [0, 0, 0, 0, 3]
p nums2 #=> [0, 0, 0, 0, 3]


オブジェクトIDではなく、配列の内容そのものを代入するためには、dupメソッドでオブジェクトのコピーを作成します。

nums1=[0,0,0,0]
nums2=nums1.dup
p nums1.object_id==nums2.object_id #=> false
nums1.push(3)
p nums1 #=> [0, 0, 0, 0, 3]
p nums2 #=> [0, 0, 0, 0]

追加メソッドを利用した作例

配列seqを使って、フィボナッチ数列を作ってみましょう。フィボナッチ数列とは、第1項と第2項を1とし、第3項以降は前の2項の和となっている数列のことです。配列は負の数で末尾から数えた要素を参照できるので、

seq<<seq[-2]+seq[-1]

で次の要素を計算できます。

以下は、フィボナッチ数列を作るRubyスクリプトです。

seq=[nil,1,1] #番号を1で始めるため、先頭にダミーデータとしてnilを挿入

(100-2).times do #第100項まで求める
seq<<seq[-2]+seq[-1]
end

seq.each_with_index do |n,i|
next if !n
puts"%2d :%d"%[i,n]
end

実行結果


1 :1
2 :1
3 :2
4 :3
5 :5
6 :8
7 :13
8 :21
9 :34
10 :55

(中略)

91 :4660046610375530309
92 :7540113804746346429
93 :12200160415121876738
94 :19740274219868223167
95 :31940434634990099905
96 :51680708854858323072
97 :83621143489848422977
98 :135301852344706746049
99 :218922995834555169026
100 :354224848179261915075

Rubyの配列の扱いは自由自在

RubyのArrayクラスには、要素の追加、削除などのメソッドが多く提供されています。よって、Arrayクラスは配列としてだけではなく、スタックやキューとしての扱いもメソッドだけでできます。ただし、配列を他の変数に代入するときには、オブジェクトID(参照先)が代入されることに注意しましょう。

スタックやキューを実装するのに必要な、配列の他の操作については、以下の関連記事を参照してください。

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