`Hash#[]`在排序哈希后给出TypeError

时间:2016-01-09 15:41:25

标签: ruby hash integer

使用以下代码:

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"不存在作为键。

2 个答案:

答案 0 :(得分:1)

Enumerable#sort_by会返回ArrayArrayIntegers编入索引,但您可以使用第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