eachメソッドを入れ子で使う
今回は3層構造の配列を扱う。
目次
3層構造の配列からif文を使って目当ての情報を検索する
3層構造の配列からif文を使って目当ての情報を検索する。
コードを書いてみる。
test.rb
races = [ [ ["1", "N会社東京A", "05:58.78", "3", nil], ["2", "C電力", "06:02.17", "4", nil], ["3", "T滋賀", "06:04.47", "5", nil], ["4", "S大学", "06:06.17", "2", nil], [nil, "X大学", nil, "1", "棄権"] ], [ ["1", "N会社大阪A", "05:47.74", "3", nil], ["2", "M大学", "05:51.44", "2", nil], ["3", "C大学", "05:53.49", "5", nil], ["4", "N大学", "05:57.27", "4", nil] ], [ ["1", "N会社東京B", "05:58.78", "3", nil], ["2", "Cボートクラブ", "06:03.17", "4", nil], ["3", "T大学", "06:04.47", "5", nil], ["4", "Sローイング倶楽部", "06:07.17", "2", nil], [nil, "Z大学", nil, "1", "失格"] ] ] races.each do |race| race.each do |result_by_rank| if /.*N会社東京[A-Z]?/ =~ result_by_rank[1] p race end end end
実行結果
見やすくするため改行を入れてあります。
[ ["1", "N会社東京A", "05:58.78", "3", nil], ["2", "C電力", "06:02.17", "4", nil], ["3", "T滋賀", "06:04.47", "5", nil], ["4", "S大学", "06:06.17", "2", nil], [nil, "X大学", nil, "1", "棄権"] ] [ ["1", "N会社東京B", "05:58.78", "3", nil], ["2", "Cボートクラブ", "06:03.17", "4", nil], ["3", "T大学", "06:04.47", "5", nil], ["4", "Sローイング倶楽部", "06:07.17", "2", nil], [nil, "Z大学", nil, "1", "失格"] ]
実行結果は目当てのクルーが含まれるレース情報のみ表示されている。
コードの解説
コード概略
- レース結果の配列をつくって変数racesに代入する
- 配列構造は「全体の配列」 > 「1レース単位の配列」 > 「順位別の配列」
- eachメソッドで全体(races)の中から1レース単位の配列(race)を取りだす
- 更にeachメソッドで、1レース単位の配列(race)から順位別の配列(result_by_rank)を取りだす
- eachメソッドが入れ子になる
- もし順位別の配列(result_by_rank)のインデックス[1]が"N会社東京"だったら、という条件をつける
- 正規表現の内容は後述
- 条件が成り立ったら、1レース単位の配列(変数race)を詳細つきで出力する
- 出力するのは
result_by_rank
ではなくrace
。
- 出力するのは
- eachメソッドは要素がなくなるまで指示を繰り返す
正規表現 [ ]
if文の条件のところで正規表現を使ってAからZの符号をあいまい検索にしている。
正規表現[ ]
は中の文字列どれか1つの意味。
[A-Z]
はAからZのうちどれか、という意味。
[A-Z]?
はAからZのうちどれか、が0回もしくは1回の繰り返し、の意味。
今回の動作確認環境
Ruby 2.4.3p205
macOS 10.13.3
ターミナル
Windows10
Windows PowerShell