今日はRubyの配列を学んでいきますよ
配列は何に使うんですか?
配列を上手に使うとたくさんの情報を管理できます。とくに順番どおりに管理したいときに、とても役立つものですよ
なんか、難しそうだなぁ
そうなんです。Rubyの学習でつまづきやすい部分の1つとも言われています。だから今回の講義はいつも以上に丁寧に説明していきますよ
おねがいしまーす
Rubyの配列を「名前の登録」から学ぼう
なるべくわかりやすいように、名前の登録をするシチュエーションで説明しますね。「会員の名前を登録する場面」だと思ってください
さて、会員の名前を登録するわけですが……数人ならまったく問題ないでしょう。
name1 = “田中一郎”
name2 = “鈴木太郎”
name3 = “中村次郎”
このように書けば良いです。でも、千人や一万人単位で管理しようとすると、名前を全部書き出すだけでも、こんな感じになってしまいます。
puts name1
puts name2
…
puts name10000
うわぁ……大変そうですね。でも企業で会員の管理をしようとしたら千人や一万人の可能性は、普通にありますよね
そうなんです。だから、こんなときに配列を使うんですよ。ちなみに配列は(array)と言いますので覚えておくといいですよ
Rubyでの配列の作り方
配列の作り方は簡単です。
name = [“田中一郎”, “鈴木太郎”, “中村次郎”]
これで、三つの文字列を持つ配列ができます。
大かっこ'[]’の間にカンマ’,’で区切って要素を書くだけです。以下のように添え字を付けることで各々の要素(この場合は文字列)を参照できます。
puts name[0]
puts name[1]
puts name[2]
この場合だと、name[0]で”田中一郎”を参照できるようになります
んん? 1からではなくて、0からなの?
そうなんです。添え字は0から始まるので、その点には注意してくださいね
後ろから参照することも可能
配列を使うと、「要素の○番目」ではなく「要素の最後」を参照することもできます。
puts name[-1]
これで要素の最後の参照です。ちなみに後ろから二番目は、
puts name[-2]
です。この参照方法なら配列の要素の数を意識することなく、後ろのほうの要素もスムーズに参照というわけです。
配列の要素の数の出し方
また、
p name.length
と書くと、配列nameの要素の数が表示されます。printとputsとpで出力が変わります。この辺を実際に動かしてみると以下のようになります。
また、
member = [“田中”, “一郎”, 26, [2001, 3, 26]]
のように、配列の要素には、文字列、数字、配列を混在できます。
この例の場合、member[3]の要素は、[2001, 3, 26]という名前がついていない配列になります。
ちなみに配列の大きさの上限が、Rubyにはありません。コンピューターのメモリの上限まで使うことができます。現実問題としては遅くなるので実用的ではありませんが。
配列をもっと応用してみよう
配列は使いこなせると、とても便利なんですよ。いろいろなことができるようになります。一部を紹介しますね
配列は一度生成した後、大きさを変えたり、その他にもいろいろなことができます。
たとえば、rangeを使うとこのようなことができます。
一行目の様に書くと、2から5までを要素とする配列を作れます。二行目のように書くと、dからkまでを一文字ずつ文字列の要素とした配列が作れます。
p (2..5).to_a
p (‘d’..’k’).to_a
一番後ろに要素を追加
名前の名簿などを作っているときは、情報を追加したくなる場合もありますよね
会員が増えていけばそうなりますよね
一番後ろに要素を追加したいときは、下の画像のように明示的に添え字を指定して書き込むか、push, ‘<<‘ を使います。
name[3] = “山本三郎”
name.push(“高橋四郎”)
name << “山崎五郎”
すると、高橋四郎や山崎五郎が要素の後ろに追加されます。
要素の削除
また、要素を削除(delete)して、その分詰めることも可能です。
name.delete(“中村次郎”)
このようにプログラミングすると、配列の中から”中村次郎”である要素を見つけて、削除し、その分前に詰めます。
また、
name[1,2] = []
としたときは添え字の1(つまり2番目です)から、添え字の2(つまり3番目です)までを削除し、その分前に詰めるプログラムです。
中村さんは、なんかの会員をやめたんだね。中村さん今までありがとう。君のことは忘れないよ
配列での挿入
削除とは逆に、新たな要素を挿入することもできます
んん? さっき「追加」を教えてもらった気がするけど。挿入と追加は何が違うの?
挿入は、好きな場所を指定してその場所に追加できるんですよ。ちなみに挿入は(insert)と言います
添え字が3の後ろに(つまり4番目に)、”中村次郎”という要素を挿入してみましょう。
name.insert(3,”中村次郎”)
こうプログラミングすると、中村次郎が配列の4番目に追加されました。
中村さん、また会員になったのか。戻ってくんの早かったなぁ
配列の結合
続いては、結合です。配列では、二つの配列を結合(concat)することもできます。
この例では、
name1.concat(name2)
を使って、name1の後ろにname2を結合しています。
これは使いそうですね。AのグループとBのグループが合わさって1つの大きなグループになる……よくある話です
吸収合併とか、か
重複の削除
リストを作っていて、つい同じ人の名前を2回書いてしまうことはありますよね。そんなときは、「重複の削除」が有効です。重複の削除は、(uniq)と呼びます
配列をよく見ると、最初と四番目に”田中一郎”が二つあります。重複を削除したいのであれば、
p name.uniq
と書くと、最初の要素を生かして、重複する四番目の要素を削除して、前に詰めてくれます。
これは使えますね
最初に言ったように配列はつまづきやすいポイントでもあるのですが、理解するととても使えるポイントでもあるんですよ。この先は、配列でできることを少し駆け足で紹介しますね
要素の追加
要素を追加するときに、今の要素の数より大きいところに追加すると、
のように、間にはnilが自動的に挿入されます。6番目に”山本三郎”が追加されています。4番目と5番目はnilが自動的に挿入されています。
反転
要素の反転(reverse)をすることもできます。
並び変え
配列の要素の大きい順、小さい順に並べ替える(sort)こともできます。
この例では、小さい順に並べ替えています。
配列に対する繰り返し
このように配列に対してはいろいろな操作が準備されているのですが、もっと複雑な処理をしたいこともあります。そういう時はfor文、each文と組み合わせます。
for文とeach文は、前の講義で習ったやつですね
習った!習った! えーと、でも、どんなんだったっけ?
猫田さんのように、忘れてしまった人はこちらで復習しましょう。
復習してきました!
はい。では、配列の中を順番に見て行って、偶数を見つけたら出力するプログラムを書いてみましょうか
for文の場合
まず、numberという配列の準備です。
for文の読み方は、numberという配列に対してdoとendの中を処理を行います。for文の中で要素を一つ一つ使うのですが、今から使う要素を変数numとして使います。
次のif文では、その変数numを2で割った余りが0だったら、つまり、偶数だったら、thenとdoの中を処理します。つまり、出力します。奇数だったら何もしません。
結果的に、3と5は出力されないので、出力されるのは、2,10,4,100,-4になります。
おおおお、なんか一気にプログラミングぽくなりましたねぇ
each文の場合
同じことをeach文を使って書いてみます。
for num in number do
number.each{|num|
微妙に書き方が違います。慣れないうちは英単語と記号が並んでいると思うかもしれませんが、パターン化されているので、慣れるまでは早いかと思います。
プログラミングって、今の例のようにプログラムの仕方が複数あるのが面白いですよね
多次元配列
すでにこの講義の説明の中ででもちょこちょこ出てきていますが、配列の中に配列を入れることもできます。
たとえば、名前と年齢を同時に管理したいときは、
name = [[“田中一郎”, 24], [“鈴木太郎”, 18], [“中村次郎”, 30]]
と書けます。参照するときは、
puts name[1][0]
のように参照できます。
おまけ
最後におまけです。使うかどうか微妙ですが、
[3, [4, 5], [6, [7, 8], 9], 10]
みたいな配列はflattenを使うと、一次元の配列になります。
まとめ
以上で、今回の配列の講義はおしまいです。二人とも、どうでしたか?
今回習った配列は、使う場面が想像しやすかったので理解できました
……復習しておきまーす
そうですね。簡単にで良いので復習しておいてください。また、完全に理解しなくても、実際に使う場面がやってきたら学び直す感じでも良いと思いますよ