今までの解説では、データをバラバラに扱ってきました。 たとえば、3つの整数型のデータを扱う場合、変数a,b,cといった具合に3つの変数を使いました。多くのプログラミング言語では、これを1つにまとめて扱うことができます。このような仕組みの1つが配列です。
以下のプログラムを見てください。
a = [90, 55, 26, 100] print a[0], "\n" print a[1], "\n" print a[2], "\n" print a[3], "\n"
このプログラムでは、90,55,26,100という4つのデータを配列aに入れています。 このように複数のデータをaという配列としてまとめて扱うことができます。 この場合、以下のように4つの箱があるようなイメージです。
+-----+-----+-----+-----+ 配列a | 90 | 55 | 26 | 100 | +-----+-----+-----+-----+ a[0] a[1] a[2] a[3]
配列の1つの箱の中身を要素といいます。 例えば、この場合、配列aの一番最初(左)の要素は90です。 また、一番最後(右)の要素は100です。
各要素の値を得たり、変えたりする場合には添え字(インデックス)を使います。 例えば、a[0]は一番最初の要素を意味します。添え字はいわば、配列の何番目の 要素かを示していると言えます。ただし、Rubyの場合は添え字が0から始まります。 普通は、1番目、2番目、3番目という風に数えるのに、Rubyはいわば、0番目、1番目、2番目と数えているのです。CやJavaなど、最近の主流の言語の多くもRubyと同様です。
なぜ、添え字は0から始まるのか?
ものを数えるとき、普通は1,2,3…という風に1から始めます。 しかし、「何もない」という0個という概念があると都合が良いことが多いのです。 例えば、2つの変数xとyを足した値を添え字とする場合、xも先頭の値、yも先頭の値だとします。 添え字が1から始まる場合、xは先頭なので1、yも先頭なので1とすると、x+yでは2となるので 配列の先頭にはなりません。x+y-1としてつじつまを合わさないといけません。また、xとyの先頭を0として考えたとしても、x+y+1としなければなりません。
ところが、添え字を0から始めた場合、xが先頭なら0、yも先頭なら0とすると、x+yがそのまま配列の先頭となり、ぴったりです。
古代には数字は1からしかなく、0という概念はありませんでした。 0は5,6世紀ごろにインドで発見された、人類最大の発見の1つと言われています。 0の発見は数学に飛躍的な進歩をもたらしました。 上記の理由も0がもたらす恩恵の1つと言えるでしょう。
前の説明で触れた配列aは要素が4つあります。この場合、配列aを「4つの要素からなる配列」と言います。また、単に「大きさ4の配列」とも言います。 配列の大きさは、配列名.sizeで求めることができます。
a = [90, 55, 26, 100] b = [1,2,3,4,5,6,7,8,9,10] print "配列aの大きさは", a.size, "です\n" print "配列bの大きさは", b.size, "です\n"
以上の例では、配列の要素をprint文で表示しました。 では、配列の要素を違う値に変えるときにはどうすればよいのでしょうか。 以下のプログラムを見てください。
a = [90, 55, 26, 100] print a[0], "\n" print a[1], "\n" print a[2], "\n" print a[3], "\n" a[1] = 80 print a[0], "\n" print a[1], "\n" print a[2], "\n" print a[3], "\n"
このように a[添え字] = 値といった具合に代入すれば良いのです。
さて、以上のプログラムで配列の要素がたくさんあった場合は大変です。
a = [90, 55, 26, 100, 78, 45, 92, 48, 56, 78, 88, 85, 91, 75, 74]
print a[0], "\n"
print a[1], "\n"
…長いので省略…
print a[14], "\n"
print a[15], "\n"
繰り返しを使ってみるとすっきりします。
a = [90, 55, 26, 100, 78, 45, 92, 48, 56, 78, 88, 85, 91, 75, 74] for i in 0..(a.size-1) print a[i], "\n" end
繰り返しの範囲が 0..(a.size-1) つまり0からa.size-1 になっていることに注意してください。
以下も同様なプログラムです。変数iの範囲が違います。
a = [90, 55, 26, 100, 78, 45, 92, 48, 56, 78, 88, 85, 91, 75, 74] for i in 1..a.size print a[i-1], "\n" end
またRubyではもっと簡単に以下のように書けます。
a = [90, 55, 26, 100, 78, 45, 92, 48, 56, 78, 88, 85, 91, 75, 74] for b in a print b, "\n" end
for文の0..(a.size-1)と書いていた部分を単に配列名を書きます。 この場合、for文で繰り返す度に、配列aの要素が順番にbに代入されます。
文字列の配列も同様に作ることが出来ます。
a = ["France", "Italy", "England", "Spain"] for b in a print b, "\n" end
また、数値と文字列を混在することもできます。
a = ["France", 105, "Italy", "England", 200, "Spain"] for b in a print b, "\n" end
a = [90, "beef", "bread", 100] p a
1行目で配列を作った時に同じような形式で[90, "beef", "bread", 100]と表示されたでしょう。改行も自動的にされていることに注意してください。
とりあえず配列を作って、後からデータを入れることができます。
a = Array.new(4) p a a[0] = 90 a[1] = "beef" a[2] = "bread" a[3] = 100 p a
[nil, nil, nil, nil] [90, "beef", "bread", 100]
この場合、Array.new(4)で大きさ4の配列を作っています。このようにして配列を作ると、全ての要素がnilという値で作られます。
また、以下のように最初は空の配列、つまり要素が1つもない配列として作ることもできます。
a = [] p a a[0] = 90 p a a[1] = "beef" p a a[2] = "bread" p a a[3] = 100 p a
[] [90] [90, "beef"] [90, "beef", "bread"] [90, "beef", "bread", 100]
配列がだんだんと大きくなっているのに注目してください。 Rubyでは、現在の配列の大きさを越える要素に代入をすると、その分だけ配列が自動的に大きくなります。
a = Array.new(5) a[0] = gets.to_i a[1] = gets.to_i a[2] = gets.to_i a[3] = gets.to_i a[4] = gets.to_i print a[4], "\n" print a[3], "\n" print a[2], "\n" print a[1], "\n" print a[0], "\n"このようなプログラムで作成可能ではあるが、繰り返しを使うようにせよ。