配列に使えるメソッド その2
今回は配列に使えるメソッド その2。
その1はこちら。
目次
メソッドを探す
配列クラスのメソッドを探す。
Rubyリファレンスマニュアルにはクラス別にメソッドが載っている。
Rubyリファレンスマニュアル
https://docs.ruby-lang.org/ja/latest/class/Array.html
今回はリファレンスマニュアルに載っているものの中から次のメソッドを試す。
- values_atメソッド
- <<メソッド
- newメソッド
配列クラスのvalues_atメソッド
values_atメソッドは引数で指定したオブジェクトの配列を新たにつくる。
引数にはインデックスを入れる。
引数は複数とれる。
Rubyリファレンスマニュアル
Arrayクラス values_at
https://docs.ruby-lang.org/ja/latest/class/Array.html#I_VALUES_AT
テストする。
test.rb
infos = ["137", "10/29 15:00", "男子エイト", "順決", "1", "M生命"] p infos.values_at(1,2,3)
実行結果
["10/29 15:00", "男子エイト", "順決"]
配列infosのインデックス[1]、[2]、[3]が新たな配列に格納されている。
配列クラスの << メソッド
<<
メソッドは配列の末尾に要素を追加する。
Rubyリファレンスマニュアル
Arrayクラス <<
https://docs.ruby-lang.org/ja/latest/class/Array.html#I_--3C--3C
test.rb
p ["10/29 15:00", "男子エイト", "順決"] << 1
実行結果
["10/29 15:00", "男子エイト", "順決", 1]
見た目どおりのわかりやすいメソッド。
<<
はつなげて使える。
test.rb
p ["10/29 15:00", "男子エイト", "順決"] << 1 << "M生命"
実行結果
["10/29 15:00", "男子エイト", "順決", 1, "M生命"]
配列クラスの特異メソッド new
newメソッドは新規に配列をつくる。引数を取らない場合は空の配列をつくる。
単に[]
と書いても同じ。
Rubyリファレンスマニュアル
Arrayクラス new
https://docs.ruby-lang.org/ja/latest/class/Array.html#S_NEW
test.rb
array = Array.new
p array
array2 = []
p array2
実行結果
[] []
配列の入れ子構造をつくる
上で試したメソッドを使って配列の構造を変えてみる。
test.rb
race_results = [ ["Race No1","種目名","日時1","組別A","順位1-1","クルー名1-1","タイム1-1","レーンNo1","備考1"], ["Race No2","種目名","日時2","組別B","順位2-1","クルー名2-1","タイム2-1","レーンNo2","備考2"], ] races = Array.new race_results.each do |result| info = result.values_at(0,1,2,3) rank = result.values_at(4,5,6,7,8) race = [] race << info << rank races << race end p races
実行結果
見やすいように改行を入れてあります。
[ [ ["Race No1", "種目名", "日時1", "組別A"], ["順位1-1", "クルー名1-1", "タイム1-1", "レーンNo1", "備考1"] ], [ ["Race No2", "種目名", "日時2", "組別B"], ["順位2-1", "クルー名2-1", "タイム2-1", "レーンNo2", "備考2"] ] ]
希望どおり入れ子が1つ深くなった。
コードの説明。
- 配列の配列をつくる
- newメソッドで新規に空の配列をつくり変数racesに代入する
- eachメソッドで配列から要素(配列)をとりだす
- values_atメソッドで、特定の情報だけを新たな配列に格納する
- できた配列を変数infoに代入する
- values_atメソッドで、残りの情報を新たな配列に格納する
- できた配列を変数rankに代入する
- 空の配列を新規につくり変数raceに代入する
- 変数raceにinfo、rankを格納する
- 変数raceをracesに格納する
空の配列raceはeachメソッドの繰り返しの中でつくられているため、繰り返しの都度上書きされて空になる。
それに対してracesはeachメソッドのブロックの外でつくられているため、上書きされることなく、繰り返しraceが追加されていく。
今回の動作確認環境
Ruby 2.4.3p205
macOS 10.13.3
ターミナル
Windows10
Windows PowerShell