こんにちは! フリーエンジニアの長瀬です。
よく使用するデータ型の一つに「配列」があると思います。
ただ、配列の初期化って種類が多くて、どうやれば良いのか迷ってしまうことがあります。
そこで本記事では、rubyの配列の初期化について
・[]
・Array[]
・Array.new()
という基本的な内容から、
・ 二次元配列
・ ランダムに初期値を設定する
・ 連番
・ insert (指定した箇所に数値を挿入)
・ map (各要素をブロックに渡し、戻り値を配列として返す)
・ select (条件で要素を絞り込む)
・ uniq (数値の重複をなくす)
といった応用的な内容についても解説していきます。
基本的な配列の初期化
柔軟な書き方ができるRubyですが、その柔軟な書き方のおかげで、配列の初期化の方法は三つあります。
[]
array = [] # [] array = [1,2,3] # [1,2,3]
まずご紹介するのは、「[]」の中に初期化したい数字を入れていく方法です。
基本的な定義方法で、理由がない限りはこの方法を使用します!
何も数字を入れずに定義すると、空の配列ができあがるので、空の配列を作りたい時にも使用できます!
Array[]
Array[] # [] Array[1,2,3]
上で紹介した方法にArrayを付け足したバージョンです。
お分かりの通り、Arrayが無駄な感じがするので、使用することはあまりありません。
Array.new()
Array.new(3) # [nil, nil, nil]
newメソッドを使用して、インスタンスを作成するイメージで作成することができるのがこのメソッドです。
定義された配列には、引数に与えられた数字の長さ分のnilが入ります。
そのため長さを指定して配列を定義したい時に使用します!
発展的な配列の初期化
それでは便利な、発展的な配列の初期化を実装する方法について解説していきます!
二次元配列
他の言語では一般的な二次元配列の定義ですが、rubyに二次元配列の初期化機能はありません。
そのため、自らメソッドを実装する必要があります。
例えば3×3の二次元配列を定義したい場合は以下のようなメソッドが考えられます。
Array.new(3).map{Array.new(3)} # [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]
各配列に対してmapメソッドで、それぞれに配列の定義をしていきます。
上記の例の場合、map{Array.new(3)}の3の次の引数に何も渡していないので、nilになりますがもちろん自分で初期値を設定することもできます。
Array.new(3).map{Array.new(3,0)} #[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
この場合は0を引数として渡したので、すべての要素が0として初期化されました。
また、9に数値を変更してみると
Array.new(3).map{Array.new(3,9)} #[[9, 9, 9], [9, 9, 9], [9, 9, 9]]
ランダムに初期値を設定する
すべの要素の初期値をランダムに決定したい場合は以下のようにします。
Array.new(3).map{Array.new(3){rand(1..9)}} #[[7, 5, 9], [7, 7, 1], [1, 7, 5]] Array.new(3).map{Array.new(3){rand(1..9)}} #[[6, 7, 4], [8, 9, 4], [3, 9, 1]]
ちなみに、よくあるミスとしてArray.new(3)の次の引数としてrandの値を渡すと
Array.new(3).map{Array.new(3,rand(1..9))} #[[4, 4, 4], [1, 1, 1], [3, 3, 3]] Array.new(3).map{Array.new(3,rand(1..9))} #[[5, 5, 5], [1, 1, 1], [1, 1, 1]]
このように、同じ配列内の数値はすべて同じになります。
ランダムな数値の扱い方はこちらで詳しく解説してありますので、自信のない方は一読することをおすすめします。
連番
1から5までの配列を作りたいなどの、連番で配列を作りたい場面があると思います。
Rubyはそんな時でも簡単に定義することができます。
サンプルコードではmapメソッドを使用していますが、本記事の後半に解説がありますので使い方がわからない場合は先に読んでおくことをおすすめします。
(1..5).to_a # [1,2,3,4,5]
また2から9までなら
(2..9).to_a #[2, 3, 4, 5, 6, 7, 8, 9]
偶数列、奇数列
(1..10).map{|i| i*2} #[2, 4, 6, 8, 10, 12, 14, 16, 18, 20] (1..10).map{|i| i*2 +1} #[3, 5, 7, 9, 11, 13, 15, 17, 19, 21]
範囲の扱い方はこちらで詳しく説明してありますので、理解に自信のない方は一読することをおすすめします。
配列の便利なメソッド
配列の初期化方法がわかったところで、配列についての便利なメソッドを紹介します。
insert (指定した箇所に数値を挿入)
insertメソッドを使えば、任意の箇所に数値を挿入できて便利です。
array = (1..3).to_a puts array puts array.insert(0,99999)
[実行結果]
1 2 3 99999 1 2 3
このように0番目(先頭)に99999を追加できました。
map (各要素をブロックに渡し、戻り値を配列として返す)
mapメソッドを使えば、配列の各要素に演算を加えて新しい配列を作ることができます。
def map_test array = (1..5).to_a array.map do |a| a*3 end end puts map_test
[実行結果]
3 6 9 12 15
一見、eachメソッドと同じように見えますが、mapの場合はブロックに渡した戻り値で配列を作ります。
上記のコードのmapのところをeachに置き換えると
def map_test array = (1..5).to_a array.each do |a| a*3 end end puts map_test
[実行結果]
1 2 3 4 5
このように、結果が変わります。
というのも、eachの場合はそのままレシーバー自身を戻り値としてを返すからです。
select (条件で要素を絞り込む)
条件で絞り込んで配列から、新しい配列を作成したいときはselectメソッドを使うと簡単に実現できます。
array = (1..12).to_a puts array.select {|a| a % 3 ==0}
[実行結果]
3 6 9 12
このように、3で割ってあまりが0(3の倍数)だけに絞りこめました。
uniq (数値の重複をなくす)
配列の中身の数値の重複をなくしたいときはuniqメソッドを使いましょう。
array = [1,1,2,3,5,8,13] puts array.uniq
[実行結果]
1 2 3 5 8 13
重複していた、先頭の1が1つ消えた配列として出力されました。
関連記事
まとめ
今回はrubyの配列の初期化方法について解説していきました!
rubyの配列は様々な方法で初期化を行うことができるということがわかっていただけたでしょうか。
本記事の内容をしっかりとマスターしておけば、基本的な配列の初期化は大丈夫です。
配列はプログラミングの基本なので、侍の配列に関する他の記事も読んで理解を深めてみてはいかがでしょうか?
Rubyの配列を体系的に学びたい方に
この記事は今更聞けない!Rubyの配列とは??基礎から発展まで!の一部となります。
この記事を読むことで、Rubyの配列の内容を体系的に学ぶことができます。
Rubyの配列の習得に必要な情報を一つにまとめているので、効率よくRubyを習得したい方は是非ごらんください。