如何返回一个键在哈希时,我只有值?



最明显的答案(至少在我看来)是使用。key(value),但是我一直得到一个错误'未定义的方法为键'。我必须返回最大值的第一个实例的键。这是我输入的;

def high(x)
alphabet = Hash.new(0)
count = 0
("a".."z").each do |char|
alphabet[char] = count += 1
end
words = Hash.new(0)
x.split(" ").each do |word|
count_a = 0
word.each_char do |chars|
if alphabet.has_key?(chars)
count_a += alphabet[chars]
end
end
words[word] = count_a
end
highest = words.sort_by { |key, value| value }
(highest[0][1]..highest[-1][1]).each do |val|
if val == highest[-1][1]
return highest.key(val)
else
return highest[-1][0]
end
end
end

我知道这混乱的代码(我仅仅几个月学习编码)。我所面临的问题具体在下面的部分中;

highest = words.sort_by { |key, value| value }
(highest[0][1]..highest[-1][1]).each do |val|
if val == highest[-1][1]
return highest.key(val)
else
return highest[-1][0]
end
end

所以我写'return highest.key(val)'我希望它返回等于最高'得分'的单词,但它只是给了我未定义的方法错误。如有任何帮助,我将不胜感激。

我设法解决了我的问题!再一次,非常优雅的代码我不知道,但是如果别人是这可能有助于拥有一个类似的问题。(再次感谢所有指出这是一个数组而不是散列的人)

def high(x)
alphabet = Hash.new(0)
count = 0
("a".."z").each do |char|
alphabet[char] = count += 1
end
words = Hash.new(0)
x.split(" ").each do |word|
count_a = 0
word.each_char do |chars|
if alphabet.has_key?(chars)
count_a += alphabet[chars]
end
end
words[word] = count_a
end
highest = words.sort_by { |key, value| value }.to_h
highest_score = highest.values.last
best = []
highest.each_value do |value|
if value = highest_score
best << highest.key(value)
end
end
return best[0]
end

所以这段代码背后的一般思想是参数'x'是一个字符串,字母被标记为a = 1 b = 2等。这段代码返回得分最高的单词。如果有多个单词得分最高,它将返回这些单词中最先出现的那个。

使用Enumerable和String方法创造奇迹

我很高兴你已经回答了你自己的问题。与此同时,如果您不关心跟踪所有单词,或者保持每个单词得分的运行列表,那么您可以让Ruby为您做更多的工作,只返回得分最高的项目,从而使这更简单,更快,更少的内存占用。

Ruby有很多内置的方法来简化这样的工作,而且它的核心方法通常是高度优化的。下面是一个包含七行代码(不包括注释)的解决方案,它利用Array继承的Enumerable#zip、Enumerable#sum和Enumerable#max_by方法来完成大部分繁重的工作。

Hash#merge帮助我们处理一些边缘情况,比如复合词中的空格或破折号。然后,在String#chars和String#downcase的帮助下!就好像Ruby为我们做了一切!

在Ruby 3.0.2:

# Map your numerical score to each letter and store in a Hash.
#
# @note We can prepend a value of zero for spaces and other special
#   characters, too!
ALPHA_SCORES = {" " => 0, "-" => 0}.merge (?a..?z).zip(1..26).to_h
# Convert all words to lowercase, and return the highest-scoring word
# and its score as an Array.
def find_highest_scoring_word_in *words
words.flatten.map do |word|
word.downcase!
[word, word.chars.sum { ALPHA_SCORES[_1] }]
end.max_by(&:last)
end

这种方法提供了很大的灵活性。例如,您可以用以下所有方式调用它,它将返回正确的结果。

# pass a single Array of String objects
find_highest_scoring_word_in %w[foo bar baz]
#=> ["foo", 36]
# pass two Array of String arguments
find_highest_scoring_word_in %w[foo bar baz], %w[quux wuuble]
#=> ["wuuble", 84]
# pass in three separate String arguments
find_highest_scoring_word_in 'alpha', 'beta', 'gamma'
#=> ["alpha", 38]
# Pass in expressions that evaluate to a String. The first creates 100
# letter a's, and the second 4 z's. Since `z` is worth 26 points, and
# `a` only 1, it's "zzzz" for the win!
find_highest_scoring_word_in 'a' * 100, 'z' * 4
#=> ["zzzz", 104]

相关内容

  • 没有找到相关文章

最新更新