Ruby中如何检查单词长度并按长度分组统计计数
Ruby 按单词长度分组计数实现方案说明
现有实现评估
你编写的代码:
arr.group_by(&:length).transform_values(&:count)
完全符合Ruby社区的惯用最佳实践,逻辑清晰可读性强,没有冗余操作,在需要兼容Ruby 2.7以下低版本的场景下可以直接使用,不存在问题。
更高效的简化实现
如果项目运行环境为Ruby 2.7及以上版本(目前绝大多数正常维护的Ruby项目都满足该要求),推荐使用Ruby内置的频次统计方法tally实现,性能更优、内存开销更低,写法也更简洁:
arr.map(&:length).tally
该实现的逻辑是先遍历一次数组提取所有单词的长度值,再通过tally直接统计每个长度的出现次数,不需要像group_by方案那样生成存储所有原字符串的中间分组数组,处理大数组时性能优势非常明显,语义也更直白,读代码的人可以一眼识别出这是在做频次统计。
格式化输出目标结果
拿到统计哈希后,直接遍历即可输出你需要的文本格式:
arr = ["john","roger","matt","john", "james", "Jennifer"] length_count = arr.map(&:length).tally length_count.each do |len, count| puts "共有#{count}个名称包含#{len}个字符" end
上述代码实际运行输出为:
共有3个名称包含4个字符 共有2个名称包含5个字符 共有1个名称包含8个字符
注:你给出的预期结果中“共有1个名称包含1个字符”属于笔误,测试数组中不存在长度为1的名称,最后一个名称Jennifer长度为8。
内容的提问来源于stack exchange,提问作者Gregory
相关产品推荐
相关产品推荐

