使用以下代码:
text = "hello dog hello"
words = text.split(" ")
frequencies = Hash.new(0)
words.each { |word| frequencies[word] += 1 }
我明白了:
frequencies # => {"hello" => 2, "dog" => 1}
frequencies["test"] # => 0
如果我在上面的第一个代码之后添加以下两行:
frequencies = frequencies.sort_by {|a, b| b }
frequencies.reverse!
然后执行frequencies["test"]
,我收到此错误:
in `[]': no implicit conversion of String into Integer (TypeError)
我想frequencies
发生了一些事情,但我无法理解。我也试过puts frequencies["test"].to_s
没有运气。如何让我的程序打印0
?打印有序哈希后,"test"
不存在作为键。
答案 0 :(得分:1)
Enumerable#sort_by
会返回Array
。 Array
被Integers
编入索引,但您可以使用第9行的String
对其进行索引。
您需要将Array
转换回Hash
,例如使用Array#to_h
方法:
frequencies = frequencies.sort_by(&:last).reverse.to_h
注意:这与打印无关。错误消息清楚地告诉您错误在第9行,打印后,并且它告诉您错误是在您对[]
方法的调用中。
答案 1 :(得分:0)
这种情况发生了,因为你调用了返回数组数组的.sort_by
。
以下代码将其转换回hash并将默认值设置为0:
text = "hello dog hello"
words = text.split(" ")
frequencies = words.each_with_object(Hash.new(0)) { |word, o| o[word] += 1 }
frequencies = frequencies.sort_by{ |_, v| v }.reverse.to_h
frequencies.default = 0
p frequencies #=> {"hello"=>2, "dog"=>1}
p frequencies["test"] #=> 0