すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Ruby

【Ruby】配列の基礎を図解形式で丁寧に解説(初心者向け)

ぴっかちゃん
ぴっかちゃん

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

irb | 配列の定義方法
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番目からデータを入れる事によって複数のデータを格納することが出来ます。

irb | 配列の使用例
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メソッドで確認してみます。

irb | オブジェクトのクラスを調べる
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号のイメージを実際にコードにすると、下記のようになります。

fruits号を配列で定義する
1
fruits = ["Apple", "Pineapple", "Melon", "Grape"]

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

要素の取り出し方

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

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

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

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

irb| 要素を取り出す
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が返ります。

irb | 指定した要素が存在しない場合
1
2
irb(main):004:0> fruits[10]
=> nil

要素の変更、追加、削除をしてみよう!

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

要素を変更する方法

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

要素を変更する
1
配列[添字] = 新しい値

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

irb | 最初の要素を変更する
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が入ります。

irb | 配列にある添字よりも大きい添字を指定した場合
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を追加してみましょう。

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メソッドは、配列の末尾に引数で指定した要素を追加します。

irb | 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メソッドは要素を追加していましたが、別の配列の要素を追加したい場合は、「+=演算子」を使います。

irb | +=演算子で別の配列の要素を追加する
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を削除してみましょう。

irb | 要素を削除する方法
1
2
3
4
5
6
7
8
9
10
11
irb(main):013:0> fruits.delete_at(0)
=> "Orange"

irb(main):014:0> fruits # 配列を確認すると、Orangeが削除されています
=> ["Pineapple", "Melon", "Grape", nil, "Banana", "Lemon", "Peach", "Pear"]```

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

```irb
irb(main):015:0> fruits.delete_at(99)
=> nil

二次元配列とは?

以下のように、配列の中に要素として配列が格納された形を二次元配列と言います。二より大きい次元を持つ配列を多次元配列と言い、先ほどまでの要素が特に配列などで入れ子になっていない配列が一次元配列です。

irb | 二次元配列の例
1
2
irb(main):016:0> foods = ["Strawberry", ["Carrot", "Onion"], "Meat"]
=> ["Strawberry", ["Carrot", "Onion"], "Meat"]

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

二次元配列をイメージで理解しよう!

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

2次元配列の例

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

irb | Carrotを取得する
1
2
irb(main):017:0> foods[1][0]
=> "Carrot"

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

irb | CarrotからCabbageに変更する
1
2
3
4
5
irb(main):018:0> foods[1][0] = "Cabbage"
=> "Cabbage"

irb(main):019:0> foods
=> ["Strawberry", ["Cabbage", "Onion"], "Meat"]

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

多重代入と配列

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

irb | 多重代入の使用例
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を代入していましたが、これを配列を使って多重代入すると下記の様になります。

irb | 配列を使った多重代入
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

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

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

irb | 一つの変数に配列で値を代入する例
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という変数に入れたほうがコードが読みやすくなります。

irb | 別々の変数に多重代入で値を格納する例
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クラスのオブジェクトのこと
  • 配列の添字を使って要素を取得したり変更することが出来る
  • 配列の中に要素として配列が格納された形が二次元配列、二より大きい次元を持つ配列は多次元配列と呼ぶ

8

わかった!