Ruby如何实现将字符串字符作为key、所有出现索引作为value存入hash
问题原因
你写的代码问题出在块内的赋值逻辑:每次遍历到字符时,都执行h[el] = []<<i,相当于每次都给对应key分配一个仅包含当前索引的新数组,之前存储的旧数组直接被覆盖,所以最终只会保留每个字符最后一次出现的索引。
符合Ruby风格的修正方案
推荐用Hash默认初始化+链式调用的写法,简洁易读:
def char_indices(str) str.each_char.with_index.with_object(Hash.new { |hash, key| hash[key] = [] }) do |(char, idx), result| result[char] << idx end end
代码说明
- 用
each_char.with_index直接遍历字符串的字符和对应索引,不需要提前把字符串转成数组,减少冗余步骤 Hash.new { |h, k| h[k] = [] }给哈希设置了默认逻辑:当访问不存在的key时,自动给这个key赋值为空数组,不需要额外写判断逻辑处理key是否存在的情况- 每次直接把当前索引追加到对应字符的数组里,不会覆盖之前的内容
测试验证
调用你给出的用例输出完全符合预期:
p char_indices('mississippi') # => {"m"=>[0], "i"=>[1, 4, 7, 10], "s"=>[2, 3, 5, 6], "p"=>[8, 9]} p char_indices('classroom') # => {"c"=>[0], "l"=>[1], "a"=>[2], "s"=>[3, 4], "r"=>[5], "o"=>[6, 7], "m"=>[8]}
更精简的写法(可选)
如果偏好更短的写法,也可以直接用chars方法配合数组追加,逻辑和上面完全一致:
def char_indices(str) str.chars.with_index.with_object(Hash.new { [] }) { |(c, i), h| h[c] += [i] } end
内容的提问来源于stack exchange,提问作者Veracities
相关产品推荐
相关产品推荐

