Rubyの配列を初期化する方法について解説します。配列の初期化が必要な理由についての解説から、RubyのArrayクラスを用いた基本的な一次元配列の初期化から多次元配列の初期化、ハッシュを用いた配列の初期化までご説明します。
配列の初期化をする理由
Rubyに限らず、プログラム言語では配列を定義した後に初期化することが一般的です。
しかしどうして初期化をしなければならないのでしょうか?
思わぬエラーを防ぐため
配列は定義した直後は中身が不定な状態です。運用環境によってint型の配列の初期値が0になっていることもあれば、1だったり-10だったり、とても大きな値や小さな値が入っていることもあります。
そのような状況で0から1つずつ値を足していく配列として利用するとどうなってしまうでしょうか?
環境によって結果が変わってしまいます。それでは意図した結果が得られず、問題が発生してしまいます。
この問題を未然に防ぐためにも配列を定義した後、自分が利用したい値を明示的に反映してあげることで安全なプログラミングが可能となります。
Rubyの配列の初期化の方法
それでは本題のRubyでの配列の初期化の方法についてです。
配列の初期化は大きく分けて2種類の目的があると思います。
①配列の要素ごとに内容が異なっている。
②配列の要素すべてを同じ内容に初期化したい。
①の場合は配列リテラルを用いて要素ごとに内容を設定します。
②の場合はArray.newメソッドを利用して配列要素を一気に初期化できます。
Arrayクラスメソッドを使った方法
Rubyの配列に関する操作はArrayクラスのメソッドを利用します。
Arrayクラスとは
Rubyの配列はArrayクラスによって管理されています。
Arrayクラスについては初期化だけではなく、配列のための様々なメソッドが用意されています。
詳しくはRuby公式のリファレンスマニュアルを参照してください。
今回は初期化のための方法のみを説明させていただきます。
配列リテラルを使って配列を初期化
配列リテラルはRubyにおいてArrayクラスを初期化できる簡単な書き方の方法です。すでに配列の中身に設定したい要素が決まっているときに利用します。
[]の中に初期化したい項目を順に並べ、間をコンマで区切ります。そうすることでArrayクラスの配列変数が定義されますので後は利用したい変数名に代入してあげることで利用可能になります。
例えば配列に先頭から「First」「Second」「Third」の文字列を設定したい場合は以下のように記述します。
array = ["First", "Second", "Third"]
Array[]を使って配列を初期化
配列リテラルの前にArrayを記載する形でも同様に配列の初期化が可能です。
Arrayの記載はあってもなくても、パフォーマンスに影響はありませんので書きやすい方を利用するといいでしょう。
この場合は以下のような記述になります。
array =Array ["First", "Second", "Third"]
Array.newを使って配列を初期化
Array.newは配列を指定した個数分同じ情報で初期化するためのメソッドです。配列に10個の「String」の文字列を設定したい場合は以下のように記述します。
array = Array.new( 10, "String" )
文字列リテラルで同じ処理を書こうとすると大変な労力がかかるので、たくさんの配列を一気に初期化したい場合はこちらの方法を使うことをおすすめします。
多次元配列の初期化方法
一次元配列と多次元配列
一次元配列とは
ここまでで説明した配列は「一次元配列」と呼びます。
例えばint型の数値を一列に並べたようなデータ管理の方法です。
array = [ 1, 2, 3 ]
多次元配列とは
配列は更に配列を入れ子状に持つことが可能です。
そのような配列を一次元配列と区別するために多次元配列と呼ばれることがあります。
細かい名称としては一次元配列を持つ配列が二次元配列と呼ばれます。
その配列を更に入れ子にすることで三次元配列…と、どんどん数が増えます。
多次元配列の初期化
一次元配列を利用した初期化
多次元配列は初期化済みの一次元配列を利用して初期化することが可能です。
# 一次元配列の初期化
array1 =[1, 2, 3]
array2 =[10, 20, 30]
# 多次元配列の初期化
arrays = [array1, array2]
多次元配列だけで初期化
一次元配列の定義を書かなくても、以下のようにそのまま書くことも可能です。
arrays = [ [1, 2, 3], [10, 20, 30]]
さらに書き方も、様々な初期化方法が混在しても構いません。ここまでで説明した初期化手段が混在する方法でも可能です。
array1 = [1, 2, 3]
arrays = [ array1, [10, 20, 30], Array.new( 3, 100 ) ]
配列を初期化する型について
以下の配列の初期化は行えるでしょうか?
array = [1, ”Second”, [10, 20] ]
Rubyではこのような初期化も可能です。特に他の言語からRubyを勉強した方は驚かれる書き方かもしれませんね。
一見すると、この配列は先頭から
1 →int型の数値
"Second" →string型の文字列
[10, 20] →int型の配列
という値を設定しようとして見えます。
型が異なる値を同じ配列で管理できない言語もありますが、Rubyは配列の中で変数の型を混合しても管理することが可能です。
ハッシュを使って配列を初期化する方法
配列とハッシュの違い
配列は1つの値を並べて管理するための機能です。
arrayString=[ "First", "Second", "Third" ]
arrayValue=[ 1, 2, 3]
ハッシュは2つで1組の値を並べて管理するための機能です。
hash={ "First":1, "Second":2, "Third":3}
“First”、”Second”、”Third”の部分はキー(KEY・鍵)と呼ばれます。1、2、3の部分はバリュー(VALUE・値)と呼ばれます。
配列は[]、ハッシュは{}と、囲っているカッコが変わります。
ハッシュのキーで配列を初期化
ハッシュのキーのみで配列を初期化したい場合、以下のように記述します。
hash={ "First":1, "Second":2, "Third":3}
# arrayKey = [ "First", "Second", "Third" ] が設定されます。
arrayKey = hash.keys
ハッシュのバリューで配列を初期化
ハッシュのバリューのみで配列を初期化したい場合、以下のように記述します。
hash={ "First":1, "Second":2, "Third":3}
# arrayValue = [ 1, 2, 3 ] が設定されます。
arrayValue = hash.values
ハッシュの1要素を配列として配列を初期化
ハッシュのキーとバリューを2個の配列として初期化することも可能です。
hash={ "First":1, "Second":2, "Third":3}
# array = [ ["First",1], ["Second", 2], ["Third", 3] ] が設定されます。
array = hash.to_a
まとめ
一次元配列の初期化
Rubyの配列はArrayクラスを利用することで簡単に管理することが可能です。初期化にもArrayクラスを用いることになります。
配列の初期化内容が要素ごとに異なるのであれば配列リテラルを用いて1要素ごとに初期化します。以下のどちらかの書き方が可能です。
array = ["First", "Second", "Third"]
array =Array ["First", "Second", "Third"]
配列の初期化内容が要素ごとにすべて同じであればArray.newメソッドですべての要素を同じ内容に初期化します。以下の書き方が可能です。
array = Array.new( 10, "String" )
配列の初期化を行いたいときの利用したい目的に応じて使い分けてください。
多次元配列の初期化
多次元配列は一次元配列で初期化する配列です。
配列を更に配列で初期化します。
arrays = [ [1, 2, 3], [10, 20, 30]]
配列をハッシュで初期化
以下のようなハッシュが定義されているとします。
hash={ "First":1, "Second":2, "Third":3}
キーのみの配列を初期化したいときは以下の書き方が可能です。
arrayKey = hash.keys
バリューのみの配列を初期化したいときは以下の書き方が可能です。
arrayValue = hash.values
キーとバリューの組み合わせを配列として初期化したいときは以下の書き方が可能です。
array = hash.to_a