尝试使用单词|创建哈希价值,但我的价值总是为1

时间:2014-06-06 17:24:38

标签: ruby

我正在尝试练习一个短语(我将其定义为变量文本),然后将文本拆分为单独的单词(words = text.split)。然后,我创建一个名为频率的新哈希,并尝试给每个单词一个值,如1,2,3,以便我可以稍后按值对它们进行排序。但是当我运行它时,每个单词的值都是1.我希望它是1和2和3,依此类推。

puts "please enter a phrase"
text=gets.chomp

words=text.split

frequencies=Hash.new(0)

words.each do |word|
    frequencies[word]+= 1
end

frequencies = frequencies.sort_by { |a, b| b }
frequencies.reverse!

这就是他们被重视的方式。为什么他们都是“1”?

please enter a phrase
 Top of the morning to you
[["you", 1], ["to", 1], ["morning", 1], ["the", 1], ["of", 1], ["Top", 1]]

2 个答案:

答案 0 :(得分:0)

您需要按如下方式编写: -

puts "please enter a phrase"
text=gets.chomp

words=text.split

frequencies = Hash.new(0)

words.each do |word|
    frequencies[word]+= 1
    frequencies.default += 1
end

frequencies = frequencies.sort_by { |a, b| b }
p frequencies.reverse!

Hash.new(default) - 。如果指定了obj,则此单个对象将用于所有默认值。

当您设置默认值时,如果您执行Hash#[],您将获得默认值,如果您尝试访问的,则仍未添加到您的散列。现在,当您执行frequencies[word]+= 1时,它意味着frequencies[word] = frequencies[word] + 1。因此,第一次, RHS 上的frequencies[word],默认值*正在返回,然后,whis增加1并获得密钥的word哈希值word但您根本没有更改默认值。 "you""to""morning" ..是不同的键,你为每次迭代分配值。

  

我希望它是1和2和3等等。

然后,每次迭代,您都需要更改默认值,以满足您的需求。这可以使用Hash#default=完成。

答案 1 :(得分:0)

您正在计算单词的频率 - 数字是单词在文本中找到的次数。由于示例文本中的每个单词都是唯一的,因此所有单词的答案都是1。如果要为每个单词指定递增值,可以执行以下操作:

frequencies = Hash[words.zip(1..words.count)]

但是我不确定你真正想要的是什么,因为你实际上已经把它称为'#34;频率,"这就是你在代码中实际计算的内容。