我正在尝试练习一个短语(我将其定义为变量文本),然后将文本拆分为单独的单词(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]]
答案 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;频率,"这就是你在代码中实际计算的内容。