You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby读取赛事文本生成嵌套哈希并更新联赛统计遇阻

解决Ruby嵌套哈希实现联赛积分统计的问题

先修正数据读取的核心错误

你提供的示例输入用逗号+空格分隔数据,但代码里用了split(';'),这会导致match_info无法正确拆分每行内容,后续的home、away、score都会是无效值,自然无法填充哈希。先把拆分逻辑改成:

match_info = score_line.chomp.split(', ').map(&:strip)

chomp替代delete!("\n")更安全,split(', ')匹配输入的分隔格式,map(&:strip)能处理队名可能带的首尾空格。

正确实现嵌套哈希的初始化与更新

你用unless table.has_key?的思路没问题,但可以用更简洁的||=语法确保每个队伍首次出现时初始化统计数据,同时避免重复重置:

# 初始化空的联赛表格哈希
table = {}

file.each_line do |score_line|
  match_info = score_line.chomp.split(', ').map(&:strip)
  home = match_info[0]
  away = match_info[1]
  result = match_info[2]

  # 初始化主客队的统计模板(不存在则创建,存在则保留原有数据)
  table[home] ||= { matches_played: 0, wins: 0, draws: 0, losses: 0 }
  table[away] ||= { matches_played: 0, wins: 0, draws: 0, losses: 0 }

  # 先给两队增加参赛场次
  table[home][:matches_played] += 1
  table[away][:matches_played] += 1

  # 根据比赛结果更新胜负平数据
  case result
  when 'win'
    table[home][:wins] += 1
    table[away][:losses] += 1
  when 'draw'
    table[home][:draws] += 1
    table[away][:draws] += 1
  when 'lose'
    table[home][:losses] += 1
    table[away][:wins] += 1
  end
end

# 打印最终统计结果
pp table

代码逻辑说明

  1. 哈希初始化:||=的作用是“如果哈希中没有当前队名的键,就赋值右侧的默认统计模板;如果已存在则跳过”,完美解决重复初始化的问题。
  2. 统计更新:
    • 无论比赛结果如何,两队的参赛场次都+1
    • 用case分支清晰处理三种结果:主队赢则主队胜场+1、客队负场+1;平局则两队平局数+1;主队输则主队负场+1、客队胜场+1

测试示例输入的结果

用你给出的示例输入运行代码,最终会得到符合预期的统计:

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

关于思路的补充

你的嵌套哈希思路完全没问题,对于这种需要动态添加键的场景,哈希确实比类更灵活。如果后续要扩展功能(比如计算积分),直接在统计模板里加:points键,再根据规则更新即可(比如胜3分、平1分)。

内容的提问来源于stack exchange,提问作者Bas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:10:30