更新日:
【Ruby】 配列の基礎を図解形式で丁寧に解説(初心者向け)
配列とは、複数のデータを格納することが出来るArrayクラスのオブジェクトのことです。
1
2
3
4
5
6
irb(main):001:0> [] # 空の配列を定義
=> []
irb(main):002:0> [].class
=> Array
irb(main):003:0> a = ["データ1", "データ2", "データ3"] # 変数aに3つのデータが格納された配列を代入する
=> ["データ1", "データ2", "データ3"]
例えば、「複数の果物を0から順番に乗せたfruits号が配列のイメージ」になります。
配列の場合、上記のイメージのように0番目からデータを入れる事によって複数のデータを格納することが出来ます。
1
2
3
4
irb(main):001:0> fruits = ["Apple", "Pineapple", "Melon", "Grape"]
=> ["Apple", "Pineapple", "Melon", "Grape"]
irb(main):002:0> fruits[0]
=> "Apple"
配列の使い方
この章では、配列の使い方について1つ1つ解説します。
Rubyで配列を作ってみよう!
配列は、[]を使って定義します。配列に格納するデータが複数ある場合は、[]内にカンマ区切りで記述します。
1
2
3
4
5
6
7
8
# 空の配列を定義
[]
# 3つの要素が格納された配列を定義する
["データ1", "データ2", "データ3"]
# 変数aに3つのデータが格納された配列を代入する
a = ["データ1", "データ2", "データ3"]
上記はどれも配列になります。オブジェクトのクラスを調べることができるclassメソッド
で確認してみます。
1
2
3
4
5
6
7
8
irb(main):001:0> [].class
=> Array
irb(main):002:0> ["データ1", "データ2", "データ3"].class
=> Array
irb(main):003:0> a = ["データ1", "データ2", "データ3"]
=> ["データ1", "データ2", "データ3"]
irb(main):004:0> a.class
=> Array
上記のコードは全てArrayクラスのオブジェクトという事がわかりました。
また、Array.new
でも配列を作成することが出来ますが、使用頻度が低いので今回は扱いません。
配列の添字と要素とは?
配列には、添字(インデックス)と呼ばれる番号と要素があります。
- 添字(インデックス) - 自動でつけられる0からの番号のこと
- 要素 - 配列に格納される各データのこと
先ほどのイメージで添字と要素を整理していきましょう。
配列に格納された各果物が「要素」で、果物を識別するための0番目から始まる番号のことが添字(インデックス)になります。
このfruits号のイメージを実際にコードにすると、下記のようになります。
1
fruits = ["Apple", "Pineapple", "Melon", "Grape"]
添字は、最初の要素であるAppleから順番に自動的に付けられます。ここで注意して欲しいのは添字は1番から付けられるのではなく、0番目から付けられます。この後の配列の要素を取り出したり、変更するときに関わってきますので、添字は0番目から始まると覚えておきましょう。
要素の取り出し方
配列の各要素を取得するには、下記のように[]と添字(インデックス)を指定します。
1
配列オブジェクト[添字]
先ほどのイメージの中で各果物を取得するには、このように指定してあげると欲しい果物を取り出すことが出来ます。
これをコードに置き換えてみると、下記のようになります。
1
2
3
4
5
6
irb(main):001:0> fruits = ["Apple", "Pineapple", "Melon", "Grape"]
=> ["Apple", "Pineapple", "Melon", "Grape"]
irb(main):002:0> fruits[0] # リンゴを取得する
=> "Apple"
irb(main):003:0> fruits[2] # メロンを取得する
=> "Melon"
添字は1からではなく0から始まるので注意してください。
また、存在しない要素を指定しても、特にエラーは出ないでnilが返ります。
1
2
irb(main):004:0> fruits[10]
=> nil
要素の変更、追加、削除をしてみよう!
添字を指定すると特定の要素の変更や削除をする事が出来ます。さらに簡単に配列に要素を追加する事が出来ます。
要素を変更する方法
要素を変更するには、下記の様に添字を指定して値を代入すると変更する事が出来ます。
1
配列[添字] = 新しい値
先ほどのfruits配列の最初の要素を「AppleからOrange」に変更してみましょう。
1
2
3
4
5
6
7
8
irb(main):005:0> fruits
=> ["Apple", "Pineapple", "Melon", "Grape"]
irb(main):006:0> fruits[0] # 最初の要素はApple
=> "Apple"
irb(main):007:0> fruits[0] = 'Orange' # 最初の要素をOrangeに変更
=> "Orange"
irb(main):008:0> fruits # 最初の要素が変更されている
=> ["Orange", "Pineapple", "Melon", "Grape"]
元々配列にあった添字よりも大きい添字を指定して値を入れると、間の添字にはnilが入ります。
1
2
3
4
5
6
7
irb(main):009:0> fruits[5] = 'Banana' # fruitsの配列には3までしか添字がない
=> "Banana"
irb(main):010:0> fruits
=> ["Orange", "Pineapple", "Melon", "Grape", nil, "Banana"]
fruits
=> ["Orange", "Pineapple", "Melon", "Grape", nil, "Banana"] # nilが入る
要素を追加する方法
配列に要素を追加するには、下記の様に<<演算子
を使う事で、配列の末尾に要素を追加する事が出来ます。
1
配列 << 追加したい要素
fruits配列の末尾にLemonを追加してみましょう。
1
2
3
4
5
6
irb(main):010:0> fruits
=> ["Orange", "Pineapple", "Melon", "Grape", nil, "Banana"]
# fruitsの最後の要素にLemonを追加する
irb(main):011:0> fruits << "Lemon"
=> ["Orange", "Pineapple", "Melon", "Grape", nil, "Banana", "Lemon"]
一度に複数の要素を追加する時は、pushメソッドを使います。pushメソッドは、配列の末尾に引数で指定した要素を追加します。
1
2
3
4
5
irb(main):010:0> fruits
=> ["Orange", "Pineapple", "Melon", "Grape", nil, "Banana"]
irb(main):012:0> fruits.push("Peach", "Pear") # fruitsにPeachとPearを追加
=> ["Orange", "Pineapple", "Melon", "Grape", nil, "Banana", "Lemon", "Peach", "Pear"]
pushメソッドは要素を追加していましたが、別の配列の要素を追加したい場合は、「+=演算子」を使います。
1
2
irb(main):013:0> fruits += %w(Peach Pear)
=> ["Orange", "Pineapple", "Melon", "Grape", nil, "banana", "Lemon", "Peach", "Pear"]
上記の%w()
は、要素が文字列の配列を作成します。
要素を削除する方法
配列の特定の要素を削除するには、下記の様に「delete_atメソッド」を使います。delete_atメソッドの戻り値は、削除した値になります。
1
配列.delete_at(削除したい要素の添字)
fruitsの最初の要素であるOrangeを削除してみましょう。
1
2
3
4
5
irb(main):013:0> fruits.delete_at(0)
=> "Orange"
irb(main):014:0> fruits # 配列を確認すると、Orangeが削除されています
=> ["Pineapple", "Melon", "Grape", nil, "Banana", "Lemon", "Peach", "Pear"]
また、存在しない添字を指定するとnilが返ってきます。
1
2
irb(main):015:0> fruits.delete_at(99)
=> nil
二次元配列とは?
以下のように、配列の中に要素として配列が格納された形を二次元配列(多次元)と言います。先ほどまでの要素が特に配列などで入れ子になっていない配列が一次元配列です。
1
2
irb(main):016:0> foods = ["Strawberry", ["Carrot", "Onion"], "Meat"]
=> ["Strawberry", ["Carrot", "Onion"], "Meat"]
配列の中に配列を格納すると、入れ子になった要素にも自動的に添字がつけられます。
二次元配列をイメージで理解しよう!
先ほどの二次元配列のコードをイメージ化すると、以下の様になります。["Carrot", "Onion"]
に対しても、自動で添字がつけられます。
この二次元配列の要素を取り出すには、上記のイメージが重要になります。Carrotを取得するには、「食べ物号の添字1の中にある添字0」を指定することによって正しくCarrotを取得することが出来ます。これをコードに記述します。
1
2
irb(main):017:0> foods[1][0]
=> "Carrot"
一次元配列と同様に要素を変更することが出来ます。
1
2
3
4
5
irb(main):018:0> foods[1][0] = "Cabbage"
=> "Cabbage"
irb(main):019:0> foods
=> ["Strawberry", ["Cabbage", "Onion"], "Meat"]
二次元配列は複雑に見えますが、イメージと関連づけて理解して正しく添字の指定をすることが出来れば、取得したい要素を簡単に手に入れることが出来ます。
多重代入と配列
多重代入とは、下記の様に変数の代入を複数にまとめることでしたが、配列を使っても多重代入をする事が出来ます。
1
2
3
4
5
6
irb(main):001:0> a, b = 6, 10
=> [6, 10]
irb(main):002:0> a
=> 6
irb(main):003:0> b
=> 10
配列を使って多重代入をしてみよう
先ほどのa,bに対して6,10を代入していましたが、これを配列を使って多重代入すると下記の様になります。
1
2
3
4
5
6
irb(main):004:0> a, b = [6, 10]
=> [6, 10]
irb(main):005:0> a
=> 6
irb(main):006:0> b
=> 10
配列に値を入れるよりも、多重代入を使い最初から別々の変数に入れたほうが分かりやすいコードになる場合があります。
以下の例を参考にしてみていきましょう。
1
2
3
4
5
irb(main):007:0> family = ["Lily", "Jack"]
=> ["Lily", "Jack"]
irb(main):008:0> "私の家族の名前には、#{family[0]}と#{family[1]}がいます。"
=> "私の家族の名前には、LilyとJackがいます。"
これを多重代入にすると、下記の様に配列から要素を取り出すfamily[0]
よりもsister
という変数に入れたほうがコードが読みやすくなります。
1
2
3
4
irb(main):009:0> sister, brother = ["Lily", "Jack"]
=> ["Lily", "Jack"]
irb(main):010:0> "私の家族の名前には、#{sister}と#{brother}がいます。"
=> "私の家族の名前には、LilyとJackがいます。"
配列を理解する事が出来たら、次はHashに挑戦してみましょう。
詳しくは、Hashを基礎から理解しようを参考にしてください。
この記事のまとめ
- 配列とは、複数のデータを格納することが出来るArrayクラスのオブジェクトのこと
- 配列の添字を使って要素を取得したり変更することが出来る
- 配列の中に要素として別の配列が格納された形を二次元配列と呼ぶ