工藤探偵事務所

Resarch and Investigation

ルビー3分クッキング 第四回『配列がスタックに!』の巻

kudo-shunsaku2008-03-29


3分間で覚える Ruby のトピックスです。
でも、本家同様に実際には10分程度掛かります。

大事なのは小さな積み重ねと継続する才能ですね。

第四回は、「配列がスタックに」の巻です。

前回は配列がいきなり登場してきましたので、今回もう少しご紹介します。

Ruby では、組み込みクラスとして「配列 (Array)」 が用意されています。
Rubyでの配列の基本的な使い方の後、まずは面白い機能を使ってみましょう。

では、いざ調理。

まず配列の作り方のおさらいです。
要素が5つある配列を作ってみましょう。

ファイル名は、"array_as_stack.rb" などとして下さい。

# 配列のつくり方。おさらい。
ary = [1, 1, 1, 1, 1]
p ary

# 配列のつくり方。上と同じです。
ary = Array.new(5, 1)
p ary

実行時、コンソール画面。

C:\rubycode\3minutes2cooking>ruby array_as_stack.rb
[1, 1, 1, 1, 1]
[1, 1, 1, 1, 1]

C:\rubycode\3minutes2cooking>

値が全て「1」で要素が「5つ」ある配列をつくりました。

配列は、ブラケット(bracket, 角括弧)を使った配列式で作れます。というのは前回やりました。全ての値を「1」にして代入しました。

また配列は「Array」クラスのオブジェクトとして扱われます。また通常クラスのインスタンスを作成する場合は、「new」というクラス・メソッドを呼びます。配列も文字列同様にこれで作れます。

ここで「new」メソッドの引数に「5, 1」と指定したのは、配列の要素が「5個」で、そこに入る値が「1」と指定したのです。

では、次におさらいを兼ねて基本的な操作である配列の添え字(インデクス)で指定するやり方をみましょう。

# 添え字で指定した値を返す。
ary = [1, 1, 1, 1, 1]
p ary
p ary[0]

# 添え字で指定した場所に値(数字)を入れる。
ary[0] = 2
p ary[0]
p ary

puts

# 添え字で指定した場所に値(文字)を入れる。
ary[1] = "c"
p ary[1]
p ary

puts

# 添え字で指定した場所に値(文字列)を入れる。
ary[2] = "Tomato"
p ary[2]
p ary

puts

# 配列より大きい(?)添え字を指定して値(文字列)を入れる。
ary[5] = "Lemon"
p ary[5]
p ary

実行時、コンソール画面。

C:\rubycode\3minutes2cooking>ruby array_as_stack.rb
[1, 1, 1, 1, 1]
1
2
[2, 1, 1, 1, 1]

"c"
[2, "c", 1, 1, 1]

"Tomato"
[2, "c", "Tomato", 1, 1]

"Lemon"
[2, "c", "Tomato", 1, 1, "Lemon"]


C:\rubycode\3minutes2cooking>

添え字で指定するやり方は前回もやりましたが、今回は配列に値を代入してみました。
確認するとちゃんと値が変わっていることが判ります。
試しに文字を代入してみると、これも問題ありません。ちょっと面白いかもしれません。
文字が大丈夫なので文字列も入れてみました。これも問題ありません。
さらに調子にのって配列より大きい添え字を指定して代入してみました。これも問題ありません。

お分かりの様に、配列の要素には文字や数字を混ぜても構いません。勿論、何に使うのかが一番問題ですが、便利なことには違いありません。
また、配列の大きさは勝手に調節してくれます。普通は「5個の配列です。」と作ってしまうと、6個目を入れる場所が取られてないので駄目なのですが、Rubyの配列では自動調節です。これも便利です。

これは配列が、参照(オブジェクト・リファレンス)を保持しているだけなのでこういったこと(自動調節)が可能な様子なのですが、その効能と注意点はまたの機会にしましょう。

ここからが本題です。

スタックというデータ構造をご存知でしょうか? LIFO (Last In First Out) という方式でデータを扱うものです。最後に入れたデータが最初に取り出される、というのは新しいデータの順番に取り出されるので、つまりは最初に入れたデータが最後に取り出されます。

スタックは机の上に本を平積みに重ねた様なイメージをです。机に最初に置いた本が一番下にりますね。その本を取り出すには、上から順番に本を取り除いて一番最後に取り出されるという訳です。

もう一つは、キュー(queue、待ち行列)というデータ構造で FIFO (First In First Out) という方式です。こちらは金属管(パイプ)にビー玉を入れて転がすイメージです。何個か入れたビー玉のうち、最初に入れたビー玉が最初に出てきますよね。

では、スタックとキューでぺペロンチーノ。

# 配列はスタックになります。
peperoncino = ["tomato", "olive oil", "petroselinum neapolitanum"]
p peperoncino
p peperoncino.push("capsium annuum")
p peperoncino.push("celery")
p peperoncino.pop
p peperoncino

puts

#"garlic",
#p peperoncino.push("solt")

# 配列はキューにもなります。
p peperoncino.shift
p peperoncino.unshift("solt")
p peperoncino.unshift("garlic")
p peperoncino.unshift("mayonnaise")
p peperoncino.shift
p peperoncino

実行時、コンソール画面。

C:\rubycode\3minutes2cooking>ruby array_as_stack.rb
["tomato", "olive oil", "petroselinum neapolitanum"]
["tomato", "olive oil", "petroselinum neapolitanum", "capsium annuum"]
["tomato", "olive oil", "petroselinum neapolitanum", "capsium annuum", "celery"]
"celery"
["tomato", "olive oil", "petroselinum neapolitanum", "capsium annuum"]

"tomato"
["solt", "olive oil", "petroselinum neapolitanum", "capsium annuum"]
["garlic", "solt", "olive oil", "petroselinum neapolitanum", "capsium annuum"]
["mayonnaise", "garlic", "solt", "olive oil", "petroselinum neapolitanum", "capsium annuum"]
"mayonnaise"
["garlic", "solt", "olive oil", "petroselinum neapolitanum", "capsium annuum"]

C:\rubycode\3minutes2cooking>


スタックとして使う場合は、「push」、「pop」 というメソッドを使っています。これらは末尾要素に対する操作です。

キューとして使う場合は、「unshift」、「shift」 というメソッドを使っています。こちらは、先頭要素に対する操作です。

キューの操作では「Enqueue」、「Dequeue」といった用語を使いますが、動作を表現する汎用的な意味でも「unshift」、「shift」という名前が使われている様子です。(PerlJavaScript などの言語でも同じ名前の様子ですしね。)

Rubyの配列ではこういったメソッドが用意されていますので、目的に応じて利用する事が出来て便利です。

配列には他にも色々便利なメソッドが沢山あります。また機会を見てご紹介していきたいと想います。

そして繰り返しですが、Rubyプログラミングでは『配列』(Array)と『ハッシュ』(Hash)を制覇できれば、「鬼に金棒」の筈です。

近いうちにハッシュにも挑戦していきましょう。



「たらこー♩たらこー♩たっぷり♫たらこー♩」

今日はここまで。次回をお楽しみに。