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

Ruby中report_checker方法问题:重复输出与未统计未分类词

Ruby report_checker函数错误排查与修复

错误原因分析

  • 重复统计行问题:原代码遍历每个输入元素时,每次都将该元素的统计结果添加到数组中。比如输入两个"Green",就会两次生成"Green: 2"并加入数组,最终输出重复行。
  • 未分类词汇统计失效:处理非分级词汇时,代码将当前元素x替换为"Unaccounted"后,用input.count(x)统计次数,但原输入数组中并没有"Unaccounted"这个值,因此无法正确统计未分类词汇的数量。

修复后的代码

def report_checker(string)
  grading = ["Green", "Amber", "Red"]
  # 处理输入字符串,拆分后转换为对应的分类
  processed_items = string.tr(',', ' ').split.map do |item|
    grading.include?(item) ? item : "Unaccounted"
  end
  # 统计每个分类的出现次数
  counts = processed_items.group_by(&:itself).transform_values(&:size)
  # 按指定格式生成结果行,仅保留有统计值的分类
  result_lines = []
  # 先按Green/Amber/Red的顺序添加结果
  grading.each do |grade|
    result_lines << "#{grade}: #{counts[grade]}" if counts.key?(grade)
  end
  # 添加未分类词汇的统计(如果存在)
  result_lines << "Unaccounted: #{counts["Unaccounted"]}" if counts.key?("Unaccounted")
  result_lines.join("\n")
end

# 测试用例
puts report_checker("Green, Amber, Green")
# 输出:
# Green: 2
# Amber: 1

puts report_checker("Green, Blue, Red, Yellow")
# 输出:
# Green: 1
# Red: 1
# Unaccounted: 2

代码说明

  1. 输入预处理:先将输入字符串中的逗号替换为空格,拆分后遍历每个元素,将非分级词汇统一转换为"Unaccounted",确保后续统计的准确性。
  2. 频次统计:使用group_by(&:itself)将相同分类的元素分组,再用transform_values(&:size)获取每组的元素数量,这是Ruby中高效统计数组元素频次的标准写法。
  3. 结果格式化:按照要求的顺序生成结果行,只包含有实际统计值的分类,避免出现无意义的0次条目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:20:46