Ruby中大写字母频率统计代码异常问题求助
解决大写字母表频率统计的问题
我一眼就揪出问题所在啦!你的代码里有两个关键bug,导致大写字母的频率统计完全失效:
1. 块参数和外部变量重名
你在alphabet.collect do |s1|这里用了s1作为块参数,但外面已经定义了s1 = @string的变量。虽然这不会直接导致功能崩溃,但会让代码可读性变差,而且容易混淆变量指向,建议换成更清晰的名字比如char。
2. 频率哈希的键不匹配
这才是核心问题!你说用小写字母表时功能正常,说明@l1这个存储频率的哈希里,键是小写字母。但你现在用大写字母'A'..'Z'去查找,自然找不到对应的值(会返回nil),后面的freq > 0判断就全错了。
修正方案
给你两种直接可行的写法,选适合你业务场景的就行:
写法一:将大写字母转小写匹配哈希键
s1 = @string alphabet = 'A'..'Z' mappedfreq = alphabet.collect do |char| # 换个清晰的块参数名 freq = @l1[char.downcase] || 0 # 转小写查哈希,查不到默认设为0 freq > 0 ? "#{char}: #{'* ' * freq}" : '' end
写法二:提前把频率哈希的键转为大写
如果你的业务逻辑更适合用大写键,那可以先处理@l1:
# 先把频率哈希的所有键转成大写 @l1 = @l1.transform_keys(&:upcase) # 再执行统计逻辑 s1 = @string alphabet = 'A'..'Z' mappedfreq = alphabet.collect do |char| freq = @l1[char] || 0 freq > 0 ? "#{char}: #{'* ' * freq}" : '' end
额外优化提示
- 用
|| 0兜底,避免nil > 0这种类型错误; - 字符串拼接用
#{}的方式更符合Ruby的简洁风格; - 块参数名尽量语义化,比如
char比s1更容易理解。
这样修改后,大写字母表的频率统计就能正常工作啦!
内容的提问来源于stack exchange,提问作者James Burton
相关产品推荐
相关产品推荐

