Ruby单词频率统计代码疑问:哈希如何存储单词与词频?
Ruby单词频率统计代码逻辑拆解
1. 哈希表初始化的关键:Hash.new(0)
你创建的frequencies是带默认值的哈希表,默认值设为0。这意味着:当你访问哈希里不存在的键时,它不会返回nil,而是返回预设的默认值0——这是整个统计逻辑的核心基础。
2. 单词与频率的存储:核心代码就是frequencies[word] += 1
这一行同时完成了「存储单词作为键」和「更新频率值」两个动作,底层执行步骤拆解如下:
- 第一步:
frequencies[word]——尝试从哈希中获取word对应的频率值。如果是第一次遇到这个单词(哈希里还没有这个键),就返回默认值0;如果之前已经存过,就返回当前的频率数。 - 第二步:
+= 1——把第一步得到的值加1,得到新的频率数。 - 第三步:把新的频率数赋值回
frequencies[word]——这一步会自动将word作为键、新频率作为值存入哈希:如果是新单词,就新增一个键值对;如果是已存在的单词,就更新对应的值。
举个具体例子:
- 第一次遍历到
how时:frequencies["how"]返回默认值0 → 0+1=1 → 哈希里新增键值对"how"=>1 - 第二次遍历到
how时:frequencies["how"]返回已有的值1 → 1+1=2 → 哈希里把"how"对应的值更新为2
3. 为什么看不到单词的存储过程?
你说在块内加打印只能看到频率,是因为没打印作为键的单词。如果想直观看到存储过程,可以在块里添加这样的打印代码:
words.each do |word| frequencies[word] += 1 p "当前单词:#{word},当前频率:#{frequencies[word]}" p "当前哈希状态:#{frequencies}" end
这样就能清楚看到每个单词作为键被存入哈希,以及频率更新的全过程。
另外补充:代码里的text = input.to_s是多余的,因为input本身就是字符串,无需再转成字符串。
内容的提问来源于stack exchange,提问作者Seby
相关产品推荐
相关产品推荐

