すでにメンバーの場合は

無料会員登録

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

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

Pikawakaにログイン

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

Rails

【Rails】 5.Rubyの配列を学ぼう

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

この記事では、関連のあるデータをまとめて管理することができる配列について学びます。

※ カリキュラムでは、Cloud9のターミナルやエディタを利用します。
まだ用意していない方は「AWS Cloud9を準備しよう」を参考に導入してください。

配列のイメージを図で掴もう

まずは「配列とは何か」を図で理解していきましょう。

配列とは

配列とは番号を使って、複数のデータ(オブジェクト)への参照をまとめて管理できるオブジェクトのことです。

変数は、「1つのオブジェクトに結び付ける名札」のような存在だと学びましたね。変数自体はオブジェクトではありませんが、オブジェクトを指し示しています。

変数に代入した数値オブジェクト

それでは、配列を図で確かめてみましょう。

以下の図のように、配列は複数の名札が連結して順番に並べられています。
名札の名前は、0から順番に割り当てられます。

配列オブジェクト

配列は変数が連結して、順番に並べられているものと考えることができます。

ポイント
  1. 変数は、1つのオブジェクトを参照できる
  2. 配列は、複数のオブジェクトへの参照をまとめて管理できる
  3. 配列は、複数の名札が連結して0から順番に名前が付けられるイメージ

配列の要素

配列の中の名札は「要素」と呼ばれます。
Rubyでは、各要素はオブジェクトのことを指し示しています。

要素とオブジェクト

要素を特定することで、オブジェクトを参照することができます。要素の特定には、添字(インデックス)を使います。

配列の添字(インデックス)

要素に割り当てられた0からの番号は「添字(インデックス)」と呼ばれます。
各要素を特定するために「添字」が使われます。

添字

配列を使うことで、関連のあるデータへの参照をまとめて管理することができます。

ポイント
  1. 配列には、オブジェクトを参照できる要素がある
  2. 配列の各要素は、添字で特定することができる
  3. 添字は、要素に割り当てられた0からの番号のこと

配列は変数に代入できる

配列自体もオブジェクトなので、変数に代入することができます。

配列を変数に代入すると、以下の図のように国の名称のデータを管理する配列に対してcountriesと名付けることができます。

配列を変数に代入

変数に代入したオブジェクトは、変数名を指定することで参照することができましたが、配列を代入した場合は、どのように指定すればよいでしょうか。

以下の図のように変数名(countries)だけでは、配列自体を指していることになり、各要素のオブジェクトを参照することができません。

配列オブジェクトを参照

そこで、要素を特定することができる「添字」の登場です。
変数名に加えて「添字」を指定することで、その要素のオブジェクトが参照できます。

配列オブジェクトの要素が持つオブジェクトを参照

配列のイメージが掴めたところで、次はRubyを使って配列を学ぼう

ぴかわかさん
ポイント
  1. 配列もオブジェクトなので、変数に代入することができる
  2. 各要素の値を参照するには、添字の指定が必要になる

配列の生成方法を学ぼう

配列オブジェクトの作り方について学んでいきましょう。

配列オブジェクト

配列の生成方法

配列オブジェクトを生成するには、以下のように[]の中に要素の値(オブジェクト)を記述します。,で区切ることで、要素を複数用意することができます。

[]だけの場合は、空の配列オブジェクトが生成されます。

配列の作り方 | 要素の初期値を設定する場合
1
[1, 2, 3]
配列の作り方 | 空の配列オブジェクトを生成する場合
1
[]

以下の図のように,を使って区切ることで、,で区切ったところを要素とした配列オブジェクトが生成されます。

配列の生成方法

サンプルコード | 上記の図をコードにした場合
1
["Japan", "France", "Brazil"]

次は手を動かして、実際に配列を生成してみよう

ぴかわかさん

配列を生成してみよう

それでは、[]で配列を生成してみましょう。

irbを起動して、以下のコードを順番に実行しましょう。

irb | 空の配列を生成する
1
[]
irb | 要素の初期値を指定する場合
1
["Japan", "France", "Brazil"]
irb | 要素の初期値に数値を指定する場合
1
[100, 0, 300, 55]
irb | 異なるデータ型を指定する場合
1
["Japan", 100, "France", 300]

上記をirbで実行すると、以下の画像のように生成された配列が返ります。

配列を生成

次は配列を変数に代入する際の注意点などを確認していきます。

配列を変数に代入

以下のように右辺に配列オブジェクトを指定すると、変数に代入することができます。

配列を変数に代入する
1
変数名 = 配列オブジェクト

以下の図のように変数に代入することで、国の名称のデータをまとめて管理する配列にcountriesと名付けることができます。

配列を変数に代入

サンプルコード | 上記の図をコードにした場合
1
countries = ["Japan", "France", "Brazil"]

配列オブジェクトは、複数の値(オブジェクト)の情報がまとめて管理されているので、変数名は複数形にしましょう。

それでは、配列オブジェクトを変数に代入してみよう

ぴかわかさん

配列を変数に代入してみよう

irbを起動して、変数(countries)に国の名称をまとめた配列を代入してみましょう。

irb | 変数countriesに配列を代入する
1
countries = ["Japan", "France", "Brazil"]

動画のように変数に代入したら、変数名を使って配列を参照してみましょう。

countriesを参照

配列の基本的な使い方を学ぼう

配列の基本的な使い方について学んでいきましょう。

ここからは、Rubyのファイルを使います。
array.rbという名前のファイルを作成して、以下の内容を記述しておきましょう。

※ファイルは「pikawakaフォルダ」の直下に作成しましょう。

array.rb
1
countries = ["Japan", "France", "Brazil"]

上記をCloud9のエディタに記述すると、警告マークが表示されます。

「定義した変数がエディタ上のどこにも使用されていない」という警告なので、現時点では気にする必要はありません。

それでは、「要素の参照・変更・追加・削除・繰り返し」を順番に学んでいきましょう。

配列の操作には「添字」を理解していることが重要だよ!

ぴかわかさん
ぴっかちゃん

たしか最初の要素の添字は0だったよね!

要素の値を参照する

各要素が指し示す値を参照するには、変数名に加えて「添字」が必要でしたね。

配列オブジェクトの要素が持つオブジェクトを参照

変数名のあとに[]で要素の添字を囲むことで、その要素の値を参照できます。

要素の値を参照する
1
配列の変数名[添字]

それでは、最初の要素の値("Japan")を参照してみましょう。
array.rbにハイライト箇所を記述してみましょう。

array.rb
1
2
3
countries = ["Japan", "France", "Brazil"]

p countries[0]

続いて、動画のようにrubyコマンドarray.rbのプログラムを実行してみましょう。

最初の要素の値を参照

プログラムを実行すると、最初の要素の値である"Japan"を出力されましたね。
このように各要素の値を参照するときは、[]と「添字」を使います。

添字を指定する際の注意点

要素に割り当てられる添字は、1ではなく0から始まることに注意しましょう。

添字

2番目の要素の値("France")を参照するには、動画のように添字を2ではなく1に指定します。

2番目の要素を参照する場合

また要素としてない存在しない場合は、以下の動画のようにnilが返ります。
nilは、存在しない状態を表す値です。

nilを返す場合

要素の値を変更する

配列の要素の値を変更するには、以下のように添字を指定して変更したい値を代入します。

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

例えば、先ほどのcountriesに代入された配列の"France""Germany"に変更したい場合は、以下のように記述します。

添字

2番目の要素の値を変更する
1
countries[1] = "Germany"

それでは、2番目の要素の値("France")を変更してみましょう。
array.rbにハイライト箇所を記述してみましょう。

array.rb
1
2
3
4
5
6
7
countries = ["Japan", "France", "Brazil"]

p countries[1]

countries[1] = "Germany"
p countries[1]

続いて、動画のようにrubyコマンドでarray.rbのプログラムを実行してみましょう。

要素の値を変更する

2番目の要素の値が"France"から"Germany"に変更されているのが分かりますね。

要素を新しく追加する

配列の中に要素を新しく追加するには、<<か「pushメソッド」を使います。

要素を新しく追加する
1
配列オブジェクト << 追加したい値
要素を新しく追加する
1
配列オブジェクト.push(追加したい値)

例えば、配列["Red", "Green"]"Blue"を参照できる要素を追加する場合は、以下のように記述します。

irb | << で要素を新しく追加する
1
2
["Red", "Green"] << "Blue"
# => ["Red", "Green", "Blue"] 
irb | pushメソッドで要素を新しく追加する
1
2
["Red", "Green"].push("Blue")
# => ["Red", "Green", "Blue"] 
ぴっかちゃん

<<やpushメソッドを使うと、配列の最後に要素が追加される

<<やpushメソッドは、配列オブジェクトが代入された変数にも使えます。

要素を新しく追加する
1
2
3
4
変数名 = 配列オブジェクト

変数名 << 追加したい値
変数名.push(追加したい値)

先ほどの配列["Red", "Green"]を変数primary_colorsに代入し、要素を新しく追加する場合は、以下のように記述します。

irb | 配列を代入した変数に要素を追加する
1
2
3
4
5
6
7
primary_colors = ["Red", "Green"]

primary_colors << "Blue"
#=> ["Red", "Green", "Blue"]
primary_colors.push("Yellow")
#=> ["Red", "Green", "Blue", "Yellow"]

複数の要素を新しく追加する場合は、「pushメソッド」が便利です。

irb | 複数の要素を新しく追加する
1
2
3
4
primary_colors = ["Red", "Green"]

primary_colors.push("Blue", "Yellow")
# => ["Red", "Green", "Blue", "Yellow"]

それでは実際に<<やpushメソッドを使って、配列に要素を新しく追加していこう

ぴかわかさん

要素を新しく追加してみよう

生成した配列に要素を新しく追加します。
<<"Denmark"を追加し、pushメソッドで"Fiji","Bhutan"を追加します。

以下のコードをarray.rbに記述しましょう。

array.rb
1
2
3
4
5
6
7
8
9
10
11
countries = ["Japan", "France", "Brazil"]
p countries
countries[1] = "Germany"
p countries
countries << "Denmark"
p countries
countries.push("Fiji", "Bhutan")
p countries

続いて、動画のようにrubyコマンドを使って実行してみましょう。

rubyコマンドで実行する

実行すると、以下の画像のようにターミナルに出力結果が表示されます。

出力結果

配列に要素を追加した順番で格納されていることがわかります。要素を追加する場合は、<<かpushメソッドを使いましょう。

要素の値を削除する

配列内にある要素の値を削除する場合は、delete_atメソッドを使います。
添字で指定した要素の値が削除されます。

添字で指定した要素の値を削除する
1
配列オブジェクト.delete_at(添字)

以下のようにdelete_atメソッドを使うと、削除された値が返ります。

irb | "Blue"を削除する
1
2
["Red", "Green", "Blue", "Yellow"].delete_at(2)
#=> "Blue" 

配列を変数に代入した場合も、以下のように要素の値を削除することができます。

"Blue"を削除する
1
2
3
4
primary_colors = ["Red", "Green", "Blue", "Yellow"]

primary_colors.delete_at(2)
p primary_colors # => ["Red", "Green", "Yellow"]

配列内の要素の値を削除した場合は、以下のように後にある値が前に詰められます。

値を削除

"Blue"を削除すると、後にある"Yellow"が前に詰められます。2の添字を割り当てられた要素は"Yellow"を参照することになります。

delete_atメソッドを使うと、配列内の値の添字も変わるので注意しましょう。

それでは、要素の値を削除してみよう

ぴかわかさん

要素の値を削除してみよう

delete_atメソッドで、最初の要素の"Japan"を削除してみます。

以下のコードをarray.rbに記述しましょう。
今回は使わないp countriesが3箇所あるので、コメントアウトしておきましょう。

array.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
countries = ["Japan", "France", "Brazil"]
# p countries
countries[1] = "Germany"
# p countries
countries << "Denmark"
# p countries
countries.push("Fiji", "Bhutan") p countries p countries[0]
countries.delete_at(0)
p countries
p countries[0]

続けて、rubyコマンドを使って実行してみましょう。
実行すると、以下の画像のようにターミナルに出力結果が表示されます。

rubyコマンドを使って実行

delete_atメソッドによって、配列から"Japan"を削除することができましたね。
countries[0]で参照できる値は、削除する前後で異なるので注意しましょう。

ぴっかちゃん

確か値が削除されると、後にある値が前に詰められるんだよね

そうだよ!だから削除後countries[0]は、"Germany"を参照してるんだよ

ぴかわかさん

要素分を繰り返す

配列では、eachメソッドとブロック(do~end)を使うことで、要素分の繰り返し処理が可能になります。

eachメソッドは、配列の要素の値を順番に取り出してブロックの変数に渡します。
ブロックでは、その変数を利用して各要素の値を扱うことができます。

eachメソッドの使い方
1
2
3
配列オブジェクト.each do |変数|
  #繰り返したい処理
end

以下のようにdo~endまでがブロックです。

ブロック

以下のサンプルコードでは、「要素を3つ持つ配列」に対してeachメソッドを呼び出しています。そのため、ブロック内の処理は「3回」繰り返されることになります。

サンプルコード
1
2
3
4
5
6
7
8
9
["Japan", "France", "Brazil"].each do |country|
  p country
end

#出力結果
"Japan"
"France"
"Brazil"
#=> ["Japan", "France", "Brazil"] 

ブロックの変数(country)には、配列内で最初の要素から順番に渡されます。
そのため、"Japan"から順に出力されています。

少し難しい部分なので、処理の流れを1つ1つ確かめてみよう

ぴかわかさん

eachメソッドとブロックの役割

それでは、以下のサンプルコードの流れを図で1つ1つ説明します。

サンプルコード
1
2
3
["Japan", "France", "Brazil"].each do |country|
  p country
end

eachメソッドは、配列の要素の値を最初から順番に取り出してブロックに渡します。
最初に配列内の"Japan"を取り出し、countryに渡します。

eachメソッドの役割

次に、ブロック内の処理が実行されます。

p countryによって、変数countryの値が出力されます。
このときの変数countryは、eachメソッドから渡された"Japan"を参照します。

ブロック内の処理

配列には要素がまだ存在するので、eachメソッドは次の要素の値("France")を変数countryに渡します。そして、同様にブロック内の処理が実行されます。

このときの変数country"Japan"ではなく、"France"を参照します。

2周目の処理

このように最後の要素になるまで、処理が繰り返されます。

eachメソッドによって、配列の最初の要素から最後の要素まで順番に値が取り出されます。
そして、ブロックの変数に値を渡すことで、各要素の値に対して同じ処理を行えます。

それでは、実際にeachメソッドとブロックを使ってみよう!

ぴかわかさん

eachメソッドとブロックを使ってみよう

eachメソッドとブロックを使って、配列countriesの要素の値を全て出力させてみます。

以下のコードをarray.rbに記述しましょう。

array.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
countries = ["Japan", "France", "Brazil"]
# p countries
countries[1] = "Germany"
# p countries
countries << "Denmark"
# p countries
countries.push("Fiji", "Bhutan")
# p countries
# p countries[0]
countries.delete_at(0) p countries
# p countries[0]
countries.each do |country|
p country
end

続けて、rubyコマンドを使ってarray.rbを実行してみましょう。
実行すると、以下の画像のようにターミナルに出力結果が表示されます。

配列countriesの要素の値が最初から最後まで順番に取り出されて、ブロックの変数countryに渡されます。

そして、ブロック内で変数countryを使えば、各要素の値を参照することができます。

配列の応用的な使い方を学ぼう

2次元配列

2次元配列とは、配列の要素に「別の配列」が格納された配列のことです。

配列の要素には、文字列や数値など「あらゆるオブジェクト」を格納することができます。

あらゆるオブジェクトを格納する

1次元配列 | 文字列や数値を含む配列
1
["Japan", 392, 81]

そして、配列もオブジェクトなので配列の要素に格納することができます。

2次元配列

2次元配列 | 文字列や数値、配列を含む配列
1
["France", "Brazil", ["Japan", 392, 81]]

配列の入れ子が2段階になっている配列を2次元配列と呼びます。入れ子になっていない配列は、2次元配列(多次元配列)と比較して1次元配列と呼ぶことがあります。

比較しない場合、1次元配列のことは単に「配列」と呼ぶよ

ぴかわかさん

2次元配列の要素の値を参照する

2次元配列も変数に代入することができます。

2次元配列を変数に代入する
1
countries = ["France", "Brazil", ["Japan", 392, 81]]

2次元配列を変数に代入する

ただし、2次元配列の各要素を指定する際には注意が必要です。

"France""Brazil"配列の変数名[添字]だけで参照できますが、入れ子になった各要素の値は参照することができません。

irb | 各要素の値を参照する
1
2
3
4
5
countries = ["France", "Brazil", ["Japan", 392, 81]]

countries[0] #=>"France"
countries[1] #=>"Brazil"
countries[2] #=>["Japan", 392, 81]

countries[2]では、入れ子になった配列を参照しているだけです。
入れ子の要素に格納される"Japan"は参照されません。

さらに添字を使って、入れ子の要素を特定する必要があります。

入れ子の要素を特定する

入れ子になった要素の値を参照するには、配列の変数名[添字]に加えて入れ子の要素を特定する添字を[]で囲みます。

入れ子の要素の値を参照する
1
2
3
4
countries  = ["France", "Brazil" ["Japan", 392, 81]]

countries[2] #=>["Japan", 392, 81]
countries[2][0] #=>"Japan"

この記事のまとめ

  • 配列とは、複数のデータ(オブジェクト)への参照をまとめて管理できるオブジェクトのこと
  • 配列内の各要素は、添字を使って特定することができる
  • 配列にeachメソッドを呼び出すことで、要素分の繰り返し処理ができる

0

わかった!