【Ruby】配列の基礎を初心者に対して徹底的に分かりやすく解説!

Ruby

配列とは?

配列とは、複数のデータを格納することが出来るArrayクラスのオブジェクトのことです。

例えば、「複数の果物を0から順番に乗せたfruits号が配列のイメージ」になります。

配列のイメージ

配列の場合、上記のイメージのように0番目からデータを入れる事によって複数のデータを格納することが出来ます。

Rubyで配列を作ってみよう!
リンクをコピーしました

配列は、[]を使って定義します。配列に格納するデータが複数ある場合は、[]内にカンマ区切りで記述します。

ruby
1
2
3
4
5
6
7
8
# 空の配列を定義
[]

# 3つの要素が格納された配列を定義する
 ["データ1", "データ2", "データ3"]

# 変数aに3つのデータが格納された配列を代入する
a = ["データ1", "データ2", "データ3"]

上記はどれも配列になります。オブジェクトのクラスを調べることができる「classメソッド」で確認してみます。

shell
1
2
3
4
5
6
7
8
9
10
11
[].class
=> Array

["データ1", "データ2", "データ3"].class
=> Array

a = ["データ1", "データ2", "データ3"]
=> ["データ1", "データ2", "データ3"]

a.class
=> Array

このことから配列がArrayクラスのオブジェクトということが分かります。

※irbは省略させて頂いています。また、Array.newでも配列を作成することが出来ますが、この記事では特に扱いません。

配列の添字と要素とは?
リンクをコピーしました

配列には、添字(インデックス)と呼ばれる番号と要素があります。

  • 添字(インデックス) - 自動でつけられる0からの番号のこと
  • 要素 - 配列に格納される各データのこと

先ほどのイメージで添字と要素を整理していきましょう。

要素と添字

配列に格納された各果物が「要素」で、果物を識別するための0番目から始まる番号のことが添字(インデックス)になります。

このfruits号のイメージを実際にコードにすると、下記のようになります。

ruby
1
fruits = ["Apple", "Pineapple", "Melon", "Grape"]

添字は、最初の要素であるAppleから順番に自動的に付けられます。ここで注意して欲しいのは添字は1番から付けられるのではなく、0番目から付けられます。この後の配列の要素を取り出したり、変更するときに関わってきますので、添字は0番目から始まると覚えておきましょう。

要素の取り出し方
リンクをコピーしました

配列の各要素を取得するには、下記のように[]と添字(インデックス)を指定します。

ruby
1
2
# 添字の要素を取り出す
配列オブジェクト[添字]

先ほどのイメージの中で各果物を取得するには、このように指定してあげると欲しい果物を取り出すことが出来ます。

果物を取り出す
これをコードに置き換えてみると、下記のようになります。

shell
1
2
3
4
5
6
7
8
9
fruits = ["Apple", "Pineapple", "Melon", "Grape"]

# りんごを取得する
fruits[0]
=> "Apple"

# メロンを取得する
fruits[2]
=> "Melon"

添字は1からではなく0から始まるので注意してください。

また、存在しない要素を指定しても、特にエラーは出ないでnilが返ります。

shell
1
2
fruits[10]
=> nil

要素の変更、追加、削除をしてみよう!
リンクをコピーしました

添字を指定すると特定の要素の変更や削除をする事が出来ます。さらに簡単に配列に要素を追加する事が出来ます。

要素を変更する方法
リンクをコピーしました

要素を変更するには、下記の様に添字を指定して値を代入すると変更する事が出来ます。

ruby
1
配列[添字] = 新しい値

先ほどのfruits配列の最初の要素を「AppleからOrange」に変更してみましょう。

shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 最初の要素はApple
fruits
=> ["Apple", "Pineapple", "Melon", "Grape"]

fruits[0]
=> "Apple"

# 最初の要素をOrangeに変更
fruits[0] = 'Orange'
=> "Orange"

# 最初の要素が変更されている
fruits
=> ["Orange", "Pineapple", "Melon", "Grape"]

元々配列にあった添字よりも大きい添字を指定して値を入れると、間の添字にはnilが入ります。

shell
1
2
3
4
5
6
7
# fruitsの配列には3までしか添字がない
fruits[5] = 'Banana'
=> "banana"

# 添字の4にはnilが入る
fruits
=> ["Orange", "Pineapple", "Melon", "Grape", nil, "Banana"]

要素を追加する方法
リンクをコピーしました

配列に要素を追加するには、下記の様に「<<演算子」を使う事で、配列の末尾に要素を追加する事が出来ます。

ruby
1
配列 << 追加したい要素

fruits配列の末尾にLemonを追加してみましょう。

shell
1
2
3
4
5
6
fruits
=> ["Orange", "Pineapple", "Melon", "Grape", nil, "Banana"]

# fruitsの最後の要素にLemonを追加する
fruits << "Lemon"
=> ["Orange", "Pineapple", "Melon", "Grape", nil, "banana", "Lemon"]

一度に複数の要素を追加する時は、「pushメソッド」を使います。pushメソッドは、配列の末尾に引数で指定した要素を追加します。

shell
1
2
3
4
5
6
fruits
=> ["Orange", "Pineapple", "Melon", "Grape", nil, "banana", "Lemon"]

# fruitsにPeachとPearを追加
fruits.push("Peach", "Pear")
=> ["Orange", "Pineapple", "Melon", "Grape", nil, "banana", "Lemon", "Peach", "Pear"]

pushメソッドは要素を追加していましたが、別の配列の要素を追加したい場合は、「+=演算子」を使います。

shell
1
2
3
4
# %w()は、要素が文字列の配列を作ります(要素はスペース区切り)

fruits += %w(Peach Pear)
=> ["Orange", "Pineapple", "Melon", "Grape", nil, "banana", "Lemon", "Peach", "Pear"]

要素を削除する方法
リンクをコピーしました

配列の特定の要素を削除するには、下記の様に「delete_atメソッド」を使います。delete_atメソッドの戻り値は、削除した値になります。

ruby
1
配列.delete_at(削除したい要素の添字)

fruitsの最初の要素であるOrangeを削除してみましょう。

shell
1
2
3
4
5
6
7
# Orangeを削除します
fruits.delete_at(0)
=> "Orange"

# 配列を確認すると、Orangeが削除されています
fruits
=> ["Pineapple", "Melon", "Grape", nil, "banana", "Lemon", "Peach", "Pear"]

また、存在しない添字を指定するとnilが返ってきます。

shell
1
2
fruits.delete_at(99)
=> nil

二次元配列とは?
リンクをコピーしました

配列の要素には、どんなオブジェクトも格納することが出来ました。
下記の様に配列の中に要素として配列が格納された形を二次元配列と言います。二より大きい次元を持つ配列を多次元配列と言い、先ほどまでの要素が特に配列などで入れ子になっていない配列が一次元配列です。

ruby
1
foods = ["Strawberry", ["Carrot", "Onion"], "Meat"]

配列の中に配列を格納すると、入れ子になった要素にも自動的に添字がつけられます。

二次元配列をイメージで理解しよう!
リンクをコピーしました

先ほどの二次元配列になったコードをイメージ化すると、下記の様になります。 ["Carrot", "Onion"]に対しても自動でそれぞれ添字がつけられているのが分かります。

2次元配列の例

この二次元配列の要素を取り出すには、上記のイメージが重要になります。Carrotを取得するには、「食べ物号の添字1の中にある添字0」を指定することによって正しくCarrotを取得することが出来ます。これをコードに記述します。

shell
1
2
3
# Carrotを取得する
foods[1][0]
=> "Carrot"

一次元配列と同様に要素を変更することが出来ます。

shell
1
2
3
4
5
6
7
# CarrotからCabbageに変更する
foods[1][0] = "Cabbage"
=> "Cabbage"

# 要素がCabbageに変更されているか確認する
foods
=> ["Strawberry", ["Cabbage", "Onion"], "Meat"]

二次元配列や多次元配列は複雑に見えますが、イメージと関連づけて理解して正しく添字の指定をすることが出来れば、取得したい要素を簡単に手に入れることが出来ます。

多重代入と配列
リンクをコピーしました

多重代入とは、下記の様に変数の代入を複数にまとめることでしたが、配列を使っても多重代入をする事が出来ます。

shell
1
2
3
4
5
6
# 多重代入
a, b = 6, 10

a #=> 6

b #=> 10

配列を使って多重代入をしてみよう
リンクをコピーしました

先ほどのa,bに対して6,10を代入していましたが、これを配列を使って多重代入すると下記の様になります。

shell
1
2
3
4
5
6
# 配列を使った多重代入
a, b = [6, 10]

a #=> 6

b #=> 10

配列に値を入れるよりも、多重代入を使い最初から別々の変数に入れたほうが分かりやすいコードになる場合があります。

下記の例を参考にしてみていきましょう。

shell
1
2
3
4
5
family = ["Lily", "Jack"]
=> ["Lily", "Jack"]

"私の家族の名前には、#{family[0]}と#{family[1]}がいます。"
=> "私の家族の名前には、LilyとJackがいます。"

これを多重代入にすると、下記の様に配列から要素を取り出す「family[0]」よりも「sister」という変数に入れたほうがコードが読みやすくなります。

1
2
3
4
5
sister, brother = ["Lily", "Jack"]
=> ["Lily", "Jack"]

"私の家族の名前には、#{sister}と#{brother}がいます。"
=> "私の家族の名前には、LilyとJackがいます。"
まとめ

  • 配列とは、複数のデータを格納することが出来るArrayクラスのオブジェクトの事です。
  • 配列の添字を使って要素を取得したり変更することが出来ます。
  • 配列の中に要素として配列が格納された形が二次元配列、二より大きい次元を持つ配列は多次元配列と言います。