Ruby中仅已知哈希value如何获取对应key,调用.key方法报未定义错误怎么解决
问题排查与修复
错误根源
- 你调用
sort_by方法处理words哈希后,返回的highest是嵌套数组,结构为[[单词1, 得分1], [单词2, 得分2], ...],并不是哈希类型。只有哈希对象才有.key()方法,数组不存在该方法,所以触发了未定义方法错误。 - 你后续写的范围循环逻辑是冗余的,且第一次循环就会触发return,不会执行后续判断,完全达不到遍历对比的效果。
修复方案
你要获取得分最高且首次出现的单词,直接用Hash#max_by方法即可,该方法会在多个元素同值时自动返回最先出现的元素,完全符合你的需求。
修正后的完整代码
def high(x) # 优化字母得分哈希的生成逻辑,更简洁 alphabet = ('a'..'z').each_with_index.to_h.transform_values { |v| v + 1 } words = Hash.new(0) x.split(" ").each do |word| count_a = 0 word.each_char do |chars| count_a += alphabet[chars] if alphabet.key?(chars) end words[word] = count_a end # 直接取最高得分的第一个单词 words.max_by { |_, score| score }[0] end
如果你要保留原来的sort_by写法
sort_by默认按得分升序排列,最高得分的元素在数组末尾,直接取末尾元素的第一个值即可,不需要额外循环:
highest = words.sort_by { |key, value| value } return highest[-1][0]
内容的提问来源于stack exchange,提问作者Bitchard
相关产品推荐
相关产品推荐

