これまで使っていた変数は、値をひとつしか入れられない。これを拡張して、
ひとつの変数名に、何個でも値を入れられるようにしたものが配列変数である。
Rubyでは、配列変数を Array
という。
たとえば、変数 x
を使う場合を考えてみる。
x = 5
とすると、x
という名前の箱に、5が入る。
x |
5 |
x
を配列変数にすると何個でも値を入れられる。
x[0] | x[1] | x[2] | x[3] | x[4] |
5 | 6 | 3 | 2 | 9 |
上記の配列は、要素数5個の配列である。配列変数の最後についている
[1]
の部分を添字という。通常、添字は0から始まる数字
にする。Ruby言語では添字は0から始まらなくてもよいが、0から始める習慣をつ
けておくと、他の言語を利用するときに便利だろう。
上記の例は、5, 6, 3, 2, 9 という要素数5個の配列である。このような配列 を作るには、
x = [5, 6, 3, 2, 9]
とする。変数x
は、配列全体を意味する。5個あるうちの各要素
を取り出すには、変数の直後に [ ]
をつけ、その中に添字を記す。
たとえば先頭の要素は、x[0]
で利用する。
printf "x0=%d\n", x[0]
とすると、先頭要素である5が表示され、
x[4] = 10
とすると、(0から数えて)4番目(つまり末尾)の要素が10に変わり、 配列全体は
[5, 6, 3, 2, 10]
と変わる。
配列変数を利用する場合、最初から何個の要素があるか分かっているとは限 らない。必要に応じて個数を増やすことができる。ある変数を配列として利用 したい場合は、最初に要素数ゼロの配列を代入する。
x = []
続いて添字を1ずつ増やして行って値を代入すれば、 好きな個数の配列要素を使うことができる。
x[0] = "Hello!" x[1] = 5 x[2] = 3.1415 : (以下何個でも)
たとえば、標準入力から読み込んだ内容を配列に入れたければ、
n = 0 # 添字用 contents = [] while line=gets contents[n] = line n += 1 # 添字を1追加 end
とすれば良い。これをもっと簡単に、
contents = readlines
の1行で済ますこともできる。Rubyプログラムに与える標準入力が
Hello! 123 abc
だったとすると、配列 contents
の中味は、
["Hello!\n", "123\n", "abc\n"]
となる。
Arrayに対して行なえる、次のメソッドを覚えておこう。
length
配列の長さを返す。たとえば、
x = [1, 2, "foo"]
であれば、x.length
は 3 となる。
size
配列の長さを返す。length
メソッドと同じ。
shift
配列の先頭の要素を取り除いた上で、取り除かれた要素の値を返す。 たとえば、
y = ["1", "abc", "bar"]
であれば、y.shift
は "1" となる。さらに、先頭が取
り除かれて y
自体は ["abc", "bar"]
とな
る。
sort
配列の要素を小さい順に並べ替えた結果を返す。たとえ ば、
z = [7, 5, 1, 22]
ならば、z.sort
は
[1, 5, 7, 22]
となる。並べ替えた結果を利用したい場合は、別の変数に代入する。
y = z.sort
sort
を、文字列を要素に含む配列に使うと、辞書順に並
べ替えた結果を返す。
meibo = ["やまだたろう", "こうえきたろう", "いいもりはなこ", "あいたあきら"]
ならば、meibo.sort
は、
["あいたあきら", "いいもりはなこ", "こうえきたろう", "やまだたろう"]
となる。なお、sort
は、元の配列のコピーを取ってか
ら並べ替え作業をするので、meibo.sort
としても、
meibo
変数の値は変わらない。meibo
変数の
値そのものの順番を壊して並べ替えたいときは
meibo.sort!
とする。
reverse
配列の要素の順序を逆にした配列を返す。たとえば、
y = [1, 5, 7, 22]
なら、y.reverse
は、
[22, 7, 5, 1]
となる。
sort, reverse
を組み合わせると、逆順に並べ替えた結
果が得られる。
meibo = ["やまだたろう", "こうえきたろう", "いいもりはなこ", "あいたあきら"]
のとき、
meibo.sort.reverse ↓ ["やまだたろう", "こうえきたろう", "いいもりはなこ", "あいたあきら"]
となる。
reverse
もsort
同様、元の変数の
値は変わらない。変えたい場合は、reverse!
メソッドを
使う。
次の四つのプログラムは、いずれも与えられた標準入力をいったん配列変数 に取り込み、そのまま出力するプログラムである。
#!/usr/koeki/bin/ruby n = 0 # 読み込むときの添字 contents = [] while line=gets contents[n] = line n += 1 end n = 0 # また0から始める while n < contents.length # 行数分だけくり返す print contents[n] n += 1 end
#!/usr/koeki/bin/ruby contents = readlines while line = contents.shift print line end
#!/usr/koeki/bin/ruby contents = readlines for line in contents print line end
#!/usr/koeki/bin/ruby print readlines
print
メソッドは、与えたものが配列変数の場合、各要素を先
頭から順に出力してくれる(ただ、この方法は簡単すぎて配列の使い方の練習に
はならない)。