Ruby入門9: 配列

Ruby入門
CANIT先生
CANIT先生

今日はRubyの配列を学んでいきますよ

牛山くん
牛山くん

配列は何に使うんですか?

CANIT先生
CANIT先生

配列を上手に使うとたくさんの情報を管理できます。とくに順番どおりに管理したいときに、とても役立つものですよ

猫田さん
猫田さん

なんか、難しそうだなぁ

CANIT先生
CANIT先生

そうなんです。Rubyの学習でつまづきやすい部分の1つとも言われています。だから今回の講義はいつも以上に丁寧に説明していきますよ

猫田さん
猫田さん

おねがいしまーす

Rubyの配列を「名前の登録」から学ぼう

男性 パソコン
CANIT先生
CANIT先生

なるべくわかりやすいように、名前の登録をするシチュエーションで説明しますね。「会員の名前を登録する場面」だと思ってください

さて、会員の名前を登録するわけですが……数人ならまったく問題ないでしょう。

name1 = “田中一郎”
name2 = “鈴木太郎”
name3 = “中村次郎”

このように書けば良いです。でも、千人や一万人単位で管理しようとすると、名前を全部書き出すだけでも、こんな感じになってしまいます。

puts name1
puts name2

puts name10000

牛山くん
牛山くん

うわぁ……大変そうですね。でも企業で会員の管理をしようとしたら千人や一万人の可能性は、普通にありますよね

CANIT先生
CANIT先生

そうなんです。だから、こんなときに配列を使うんですよ。ちなみに配列は(array)と言いますので覚えておくといいですよ

Rubyでの配列の作り方

女性 スマホ

配列の作り方は簡単です。

name = [“田中一郎”, “鈴木太郎”, “中村次郎”]

これで、三つの文字列を持つ配列ができます。

大かっこ'[]’の間にカンマ’,’で区切って要素を書くだけです。以下のように添え字を付けることで各々の要素(この場合は文字列)を参照できます。

puts name[0]
puts name[1]
puts name[2]

CANIT先生
CANIT先生

この場合だと、name[0]で”田中一郎”を参照できるようになります

猫田さん
猫田さん

んん? 1からではなくて、0からなの?

CANIT先生
CANIT先生

そうなんです。添え字は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にはありません。コンピューターのメモリの上限まで使うことができます。現実問題としては遅くなるので実用的ではありませんが。

配列をもっと応用してみよう

女性
CANIT先生
CANIT先生

配列は使いこなせると、とても便利なんですよ。いろいろなことができるようになります。一部を紹介しますね

配列は一度生成した後、大きさを変えたり、その他にもいろいろなことができます。

たとえば、rangeを使うとこのようなことができます。

一行目の様に書くと、2から5までを要素とする配列を作れます。二行目のように書くと、dからkまでを一文字ずつ文字列の要素とした配列が作れます。

p (2..5).to_a
p (‘d’..’k’).to_a

一番後ろに要素を追加

CANIT先生
CANIT先生

名前の名簿などを作っているときは、情報を追加したくなる場合もありますよね

牛山くん
牛山くん

会員が増えていけばそうなりますよね

一番後ろに要素を追加したいときは、下の画像のように明示的に添え字を指定して書き込むか、push, ‘<<‘ を使います。

name[3] = “山本三郎”
name.push(“高橋四郎”)
name << “山崎五郎”

すると、高橋四郎や山崎五郎が要素の後ろに追加されます。

要素の削除

また、要素を削除(delete)して、その分詰めることも可能です。

name.delete(“中村次郎”)

このようにプログラミングすると、配列の中から”中村次郎”である要素を見つけて、削除し、その分前に詰めます。

また、

name[1,2] = []

としたときは添え字の1(つまり2番目です)から、添え字の2(つまり3番目です)までを削除し、その分前に詰めるプログラムです。

猫田さん
猫田さん

中村さんは、なんかの会員をやめたんだね。中村さん今までありがとう。君のことは忘れないよ

配列での挿入

パソコン
CANIT先生
CANIT先生

削除とは逆に、新たな要素を挿入することもできます

猫田さん
猫田さん

んん? さっき「追加」を教えてもらった気がするけど。挿入と追加は何が違うの?

CANIT先生
CANIT先生

挿入は、好きな場所を指定してその場所に追加できるんですよ。ちなみに挿入は(insert)と言います

添え字が3の後ろに(つまり4番目に)、”中村次郎”という要素を挿入してみましょう。

name.insert(3,”中村次郎”)

こうプログラミングすると、中村次郎が配列の4番目に追加されました。

猫田さん
猫田さん

中村さん、また会員になったのか。戻ってくんの早かったなぁ

配列の結合

続いては、結合です。配列では、二つの配列を結合(concat)することもできます。

この例では、

name1.concat(name2)

を使って、name1の後ろにname2を結合しています。

牛山くん
牛山くん

これは使いそうですね。AのグループとBのグループが合わさって1つの大きなグループになる……よくある話です

猫田さん
猫田さん

吸収合併とか、か

重複の削除

CANIT先生
CANIT先生

リストを作っていて、つい同じ人の名前を2回書いてしまうことはありますよね。そんなときは、「重複の削除」が有効です。重複の削除は、(uniq)と呼びます

配列をよく見ると、最初と四番目に”田中一郎”が二つあります。重複を削除したいのであれば、

p name.uniq

と書くと、最初の要素を生かして、重複する四番目の要素を削除して、前に詰めてくれます。

牛山くん
牛山くん

これは使えますね

CANIT先生
CANIT先生

最初に言ったように配列はつまづきやすいポイントでもあるのですが、理解するととても使えるポイントでもあるんですよ。この先は、配列でできることを少し駆け足で紹介しますね

要素の追加

要素を追加するときに、今の要素の数より大きいところに追加すると、

のように、間にはnilが自動的に挿入されます。6番目に”山本三郎”が追加されています。4番目と5番目はnilが自動的に挿入されています。

反転

要素の反転(reverse)をすることもできます。

並び変え

配列の要素の大きい順、小さい順に並べ替える(sort)こともできます。

この例では、小さい順に並べ替えています。

この他にも、要素の結合を行うjoin、すべての要素に同じ操作をするmap、ある条件の要素だけの配列を作るselect、selectの数だけ数えるcount、配列の末尾、先頭に追加や削除を行うpush, pop, shift, unshiftなどがあります。

配列に対する繰り返し

パソコン 犬

このように配列に対してはいろいろな操作が準備されているのですが、もっと複雑な処理をしたいこともあります。そういう時はfor文、each文と組み合わせます。

牛山くん
牛山くん

for文とeach文は、前の講義で習ったやつですね

猫田さん
猫田さん

習った!習った! えーと、でも、どんなんだったっけ?

猫田さんのように、忘れてしまった人はこちらで復習しましょう。

猫田さん
猫田さん

復習してきました!

CANIT先生
CANIT先生

はい。では、配列の中を順番に見て行って、偶数を見つけたら出力するプログラムを書いてみましょうか

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を使うと、一次元の配列になります。

まとめ

CANIT先生
CANIT先生

以上で、今回の配列の講義はおしまいです。二人とも、どうでしたか?

牛山くん
牛山くん

今回習った配列は、使う場面が想像しやすかったので理解できました

猫田さん
猫田さん

……復習しておきまーす

CANIT先生
CANIT先生

そうですね。簡単にで良いので復習しておいてください。また、完全に理解しなくても、実際に使う場面がやってきたら学び直す感じでも良いと思いますよ

挫折率が高い??プログラミング学習のポイント
駆け出しエンジニアが一緒に学ぶ
CANITは、Progateやドットインストールで独学している人達同士をつなげます。駆け出しエンジニアのあなたのためのSNSです。
Ruby入門
【この記事を書いた人】
CANIT 先生

あらゆるプログラミング言語をあやつるフリーの凄腕講師。温和な性格で「わかるまで教えます」がモットー。たまに時間ができると動物の仲間達に、プログラミングを教えることもある。現在の生徒は牛山くんと猫田さん。

CANIT
タイトルとURLをコピーしました