※ カリキュラムでは、Cloud9のターミナルやエディタを利用します。
まだ用意していない方は「AWS Cloud9を準備しよう」を参考に導入してください。
配列のイメージを図で掴もう
まずは「配列とは何か」を図で理解していきましょう。
配列とは
配列とは番号を使って、複数のデータ(オブジェクト)への参照をまとめて管理できるオブジェクトのことです。
変数は、「1つのオブジェクトに結び付ける名札」のような存在だと学びましたね。変数自体はオブジェクトではありませんが、オブジェクトを指し示しています。
それでは、配列を図で確かめてみましょう。
以下の図のように、配列は複数の名札が連結して順番に並べられています。
名札の名前は、0から順番に割り当てられます。
配列は変数が連結して、順番に並べられているものと考えることができます。
配列の要素
配列の中の名札は「要素」と呼ばれます。
Rubyでは、各要素はオブジェクトのことを指し示しています。
要素を特定することで、オブジェクトを参照することができます。要素の特定には、添字(インデックス)を使います。
配列の添字(インデックス)
要素に割り当てられた0からの番号は「添字(インデックス)」と呼ばれます。
各要素を特定するために「添字」が使われます。
配列を使うことで、関連のあるデータへの参照をまとめて管理することができます。
配列は変数に代入できる
配列自体もオブジェクトなので、変数に代入することができます。
配列を変数に代入すると、以下の図のように国の名称のデータを管理する配列に対してcountries
と名付けることができます。
変数に代入したオブジェクトは、変数名を指定することで参照することができましたが、配列を代入した場合は、どのように指定すればよいでしょうか。
以下の図のように変数名(countries
)だけでは、配列自体を指していることになり、各要素のオブジェクトを参照することができません。
そこで、要素を特定することができる「添字」の登場です。
変数名に加えて「添字」を指定することで、その要素のオブジェクトが参照できます。
配列のイメージが掴めたところで、次はRubyを使って配列を学ぼう
配列の生成方法を学ぼう
配列オブジェクトの作り方について学んでいきましょう。
配列の生成方法
配列オブジェクトを生成するには、以下のように[]
の中に要素の値(オブジェクト)を記述します。,
で区切ることで、要素を複数用意することができます。
[]
だけの場合は、空の配列オブジェクトが生成されます。
1
[値1, 値2, 値3]
1
[]
以下の図のように,
を使って区切ることで、,
で区切ったところを要素とした配列オブジェクトが生成されます。
1
["Japan", "France", "Brazil"]
次は手を動かして、実際に配列を生成してみよう
配列を生成してみよう
それでは、[]
で配列を生成してみましょう。
irbを起動して、以下のコードを順番に実行しましょう。
1
[]
1
["Japan", "France", "Brazil"]
1
[100, 0, 300, 55]
1
["Japan", 100, "France", 300]
上記をirbで実行すると、以下の画像のように生成された配列が返ります。
次は配列を変数に代入する際の注意点などを確認していきます。
配列を変数に代入
以下のように右辺に配列オブジェクトを指定すると、変数に代入することができます。
1
変数名 = 配列オブジェクト
以下の図のように変数に代入することで、国の名称のデータをまとめて管理する配列にcountries
と名付けることができます。
1
countries = ["Japan", "France", "Brazil"]
配列オブジェクトは、複数の値(オブジェクト)の情報がまとめて管理されているので、変数名は複数形にしましょう。
それでは、配列オブジェクトを変数に代入してみよう
配列を変数に代入してみよう
irbを起動して、変数(countries
)に国の名称をまとめた配列を代入してみましょう。
1
countries = ["Japan", "France", "Brazil"]
動画のように変数に代入したら、変数名を使って配列を参照してみましょう。
配列の基本的な使い方を学ぼう
配列の基本的な使い方について学んでいきましょう。
ここからは、Rubyのファイルを使います。
array.rb
という名前のファイルを作成して、以下の内容を記述しておきましょう。
※ファイルは「pikawakaフォルダ」の直下に作成しましょう。
1
countries = ["Japan", "France", "Brazil"]
上記をCloud9のエディタに記述すると、警告マークが表示されます。
「定義した変数がエディタ上のどこにも使用されていない」という警告なので、現時点では気にする必要はありません。
それでは、「要素の参照・変更・追加・削除・繰り返し」を順番に学んでいきましょう。
配列の操作には「添字」を理解していることが重要だよ!
たしか最初の要素の添字は0だったよね!
要素の値を参照する
各要素が指し示す値を参照するには、変数名に加えて「添字」が必要でしたね。
変数名のあとに[]
で要素の添字を囲むことで、その要素の値を参照できます。
1
配列の変数名[添字]
それでは、最初の要素の値("Japan"
)を参照してみましょう。
array.rb
にハイライト箇所を記述してみましょう。
1
2
3
countries = ["Japan", "France", "Brazil"]
p countries[0]
続いて、動画のようにrubyコマンドでarray.rb
のプログラムを実行してみましょう。
プログラムを実行すると、最初の要素の値である"Japan"
を出力されましたね。
このように各要素の値を参照するときは、[]
と「添字」を使います。
添字を指定する際の注意点
要素に割り当てられる添字は、1ではなく0から始まることに注意しましょう。
2番目の要素の値("France"
)を参照するには、動画のように添字を2
ではなく1
に指定します。
また要素としてない存在しない場合は、以下の動画のようにnil
が返ります。
nil
は、存在しない状態を表す値です。
要素の値を変更する
配列の要素の値を変更するには、以下のように添字を指定して変更したい値を代入します。
1
配列の変数名[添字] = 新しい値
例えば、先ほどのcountries
に代入された配列の"France"
を"Germany"
に変更したい場合は、以下のように記述します。
1
countries[1] = "Germany"
それでは、2番目の要素の値("France")を変更してみましょう。
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"
を参照できる要素を追加する場合は、以下のように記述します。
1
2
["Red", "Green"] << "Blue"
# => ["Red", "Green", "Blue"]
1
2
["Red", "Green"].push("Blue")
# => ["Red", "Green", "Blue"]
<<
やpushメソッドを使うと、配列の最後に要素が追加されるね
<<
やpushメソッドは、配列オブジェクトが代入された変数にも使えます。
1
2
3
4
変数名 = 配列オブジェクト
変数名 << 追加したい値
変数名.push(追加したい値)
先ほどの配列["Red", "Green"]
を変数primary_colors
に代入し、要素を新しく追加する場合は、以下のように記述します。
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メソッド」が便利です。
1
2
3
4
primary_colors = ["Red", "Green"]
primary_colors.push("Blue", "Yellow")
# => ["Red", "Green", "Blue", "Yellow"]
それでは実際に<<
やpushメソッドを使って、配列に要素を新しく追加していこう
要素を新しく追加してみよう
生成した配列に要素を新しく追加します。
<<
で"Denmark"
を追加し、pushメソッドで"Fiji"
,"Bhutan"
を追加します。
以下のコードを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コマンドを使って実行してみましょう。
実行すると、以下の画像のようにターミナルに出力結果が表示されます。
配列に要素を追加した順番で格納されていることがわかります。要素を追加する場合は、<<
かpushメソッドを使いましょう。
要素の値を削除する
配列内にある要素の値を削除する場合は、delete_at
メソッドを使います。
添字で指定した要素の値が削除されます。
1
配列オブジェクト.delete_at(添字)
以下のようにdelete_at
メソッドを使うと、削除された値が返ります。
1
2
["Red", "Green", "Blue", "Yellow"].delete_at(2)
#=> "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箇所あるので、コメントアウトしておきましょう。
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コマンドを使って実行してみましょう。
実行すると、以下の画像のようにターミナルに出力結果が表示されます。
delete_at
メソッドによって、配列から"Japan"
を削除することができましたね。
countries[0]
で参照できる値は、削除する前後で異なるので注意しましょう。
確か値が削除されると、後にある値が前に詰められるんだよね
そうだよ!だから削除後countries[0]
は、"Germany"
を参照してるんだよ
要素分を繰り返す
配列では、eachメソッドとブロック(do~end
)を使うことで、要素分の繰り返し処理が可能になります。
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
に渡します。
次に、ブロック内の処理が実行されます。
p country
によって、変数country
の値が出力されます。
このときの変数country
は、eachメソッドから渡された"Japan"
を参照します。
配列には要素がまだ存在するので、eachメソッドは次の要素の値("France"
)を変数country
に渡します。そして、同様にブロック内の処理が実行されます。
このときの変数country
は"Japan"
ではなく、"France"
を参照します。
このように最後の要素になるまで、処理が繰り返されます。
eachメソッドによって、配列の最初の要素から最後の要素まで順番に値が取り出されます。
そして、ブロックの変数に値を渡すことで、各要素の値に対して同じ処理を行えます。
それでは、実際にeachメソッドとブロックを使ってみよう!
eachメソッドとブロックを使ってみよう
eachメソッドとブロックを使って、配列countries
の要素の値を全て出力させてみます。
以下のコードを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
["Japan", 392, 81]
そして、配列もオブジェクトなので配列の要素に格納することができます。
1
["France", "Brazil", ["Japan", 392, 81]]
配列の入れ子が2段階になっている配列を2次元配列と呼びます。入れ子になっていない配列は、2次元配列(多次元配列)と比較して1次元配列と呼ぶことがあります。
比較しない場合、1次元配列のことは単に「配列」と呼ぶよ
2次元配列の要素の値を参照する
2次元配列も変数に代入することができます。
1
countries = ["France", "Brazil", ["Japan", 392, 81]]
ただし、2次元配列の各要素を指定する際には注意が必要です。
"France"
や"Brazil"
は配列の変数名[添字]
だけで参照できますが、入れ子になった各要素の値は参照することができません。
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メソッドを呼び出すことで、要素分の繰り返し処理ができる
この記事で学んだことをTwitterに投稿して、アウトプットしよう!
Twitterの投稿画面に遷移します