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
代码说明
- 输入预处理:先将输入字符串中的逗号替换为空格,拆分后遍历每个元素,将非分级词汇统一转换为"Unaccounted",确保后续统计的准确性。
- 频次统计:使用
group_by(&:itself)将相同分类的元素分组,再用transform_values(&:size)获取每组的元素数量,这是Ruby中高效统计数组元素频次的标准写法。 - 结果格式化:按照要求的顺序生成结果行,只包含有实际统计值的分类,避免出现无意义的0次条目。
内容的提问来源于stack exchange,提问作者jennifercodes
相关产品推荐
相关产品推荐

