簡體   English   中英

循環文本文件從數據創建嵌套的 hash 並更新 hash

[英]Looping a text file creating a nested hash from data and updating the hash

我正在嘗試處理以文本文件形式提供的一系列運動結果。 每行包含主隊名稱、客隊名稱和結果。 然后我需要更新聯賽表以顯示每支球隊的一些統計數據。

我最初將它作為 class 來嘗試,但認為它作為嵌套的 hash 可能更簡單,因為我認為我無法在不知道團隊名稱的情況下設置新對象,並且這可能會在以后更改,例如,如果我獲取數據一個新的團隊在玩我認為將它添加到 hash 更容易,因為這將是一個獨特的名稱。

我在這里找到的所有答案似乎都無法解決我的問題。 這是因為我的做法不對嗎?

示例輸入:

``file =<<~MSG
Team A, Team B, win
Team C, Team A, draw
Team C, Team B, lose
...
MSG``

所以我讀了每一行:

``file.each_line do |score_line|
  match_info = score_line.delete!("\n").split(';') # [<home>,<away>,<score>]
  home = match_info[0]
  away = match_info[1]
  score = match_info[2]
...
end``

我現在擁有每支球隊和比分。 這就是我難過的地方。 我正在嘗試創建一個嵌套的 hash 第一級是團隊名稱,下一級是統計數據。

例如:

``=> { 'Team A' => {:matches_played=> 2, :wins=> 1, :draw=> 1, lose=> 0},
  'Team B' => {:matches-played=> 2, :wins=> 1, :draw=> 0, lose=> 1},
...``

如果我創建一個簡單的 hash 的一個級別,(例如 Team => matches played)我更新散列沒有問題。 出於某種原因,一旦我嘗試更新第二級,我就會遇到問題。

隨着信息的到來,我需要更新球隊的統計數據,這可能是主隊或客隊,所以我在上面的例子中使用了homeaway變量。 為了避免重新設置 hash 的初始值,我嘗試使用#unless ,它只返回一個空的 hash。例如:

``  unless table.has_key?(home)
    table[home] = {:matches_played=> 1, :wins=> 0, :draw=> 0, lose=> 0}
  end
  unless table.has_key?(away)
    table[away] = {:matches_played=> 1, :wins=> 0, :draw=> 0, lose=> 0}
  end``

這個想法是根據score更新第二級中鍵的值。

目前我什至無法實現第二個 hash ,盡管程序運行沒有錯誤,但當我打印出 hash 時,我得到=> {} 如果沒有#unless, #unless只會在讀取每一行時不斷重置初始值。

我是 Ruby 的新手,但我覺得我總是需要在數據庫之外創建/訪問嵌套哈希,所以我想學習。

假設在處理完你的文件/輸入后,你有一個這樣的數組:

results = [
  ["Team A", "Team B", "win"],
  ["Team C", "Team A", "draw"],
  ["Team C", "Team B", "lose"]
]

您可以使用默認 proc創建一個 hash,它為新條目設置默認值:

table = Hash.new { |h, k| h[k] = { matches_played: 0, wins: 0, draw: 0, lose: 0 } }

現在,您可以像這樣循環處理上述結果:

results.each do |home, away, score|
  table[home][:matches_played] += 1
  table[away][:matches_played] += 1

  case score
  when 'win'
    table[home][:wins] += 1
    table[away][:lose] += 1
  when 'lose'
    table[home][:lose] += 1
    table[away][:wins] += 1
  when 'draw'
    table[home][:draw] += 1
    table[away][:draw] += 1
  end
end

默認 proc 確保每個子散列都具有初始設置為 0 的值。

除了默認過程,您還可以有條件地顯式分配每個初始 hash:

results.each do |home, away, score|
  table[home] ||= { matches_played: 0, wins: 0, draw: 0, lose: 0 }
  table[away] ||= { matches_played: 0, wins: 0, draw: 0, lose: 0 }

  # ...
end

以上任一結果table

{
  "Team A"=>{:matches_played=>2, :wins=>1, :draw=>1, :lose=>0},
  "Team B"=>{:matches_played=>2, :wins=>1, :draw=>0, :lose=>1},
  "Team C"=>{:matches_played=>2, :wins=>0, :draw=>1, :lose=>1}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM