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
- 用
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
相关产品推荐
相关产品推荐

