ローイングファンのプログラミング日記

ボート競技やプログラミングについて書きます

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)を取りだす
  • もし順位別の配列(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