我无法理解循环是如何工作的,即它如何找到相似的单词并增加散列中的值:
words.each { |word| frequencies[word] +=1 }
例如,如果我们输入:“这是数组中的文本”
输出为:This:1,is:1,the:2 etc ......
循环如何检测到“发生”2次?
puts "Your text, please: "
text = gets.chomp
words = text.split(" ")
frequencies = Hash.new(0)
words.each { |word| frequencies[word] +=1 }
frequencies = frequencies.sort_by do |key, value|
value
end
frequencies.reverse!
frequencies.each { |key, value|
puts key+ " " + value.to_s
}
答案 0 :(得分:0)
因为无论何时执行frequencies[word] +=1
,如果它还不存在,它会在频率哈希值中创建一个键,并且如果密钥已经存在于哈希中,那么它会增加价值一。
拥有"这是数组中的文字":
frequencies = Hash.new(0) # Initial value {}
words.each { |word| frequencies[word] += 1 }
# first iteration: { "The" => 1 }
# second iteration: { "is" => 1 }
# third iteration: { "the" => 1 }
# ...
当这个词出现在第二个""从字符串中,它增加了键的值""在频率哈希。
通过使用object += value
,您可以告诉左边的那个当前值加上右边的值。正如Sagar所说,它等同于object = object + value
。
注意:
split
相当于split(' ')
。Enumerable#each_with_object
。可以使用each_with_index简化:
words.each_with_object(Hash.new(0)) { |word, hash| hash[word] +=1 }
或者如果使用Ruby 2.4或更高版本,使用group_by和transform_values(不像each_with_object那样快):
words.group_by(&:itself).transform_values(&:count)
答案 1 :(得分:0)
巧妙的诀窍在于这一行:
frequencies = Hash.new(0)
这会创建一个哈希,如果您查找不存在的密钥,则哈希将返回0.例如,假设您计算以下字符串中的单词:
"cat dog cat mouse"
最初你有:
frequencies = {}
并且ruby在each()
块中执行以下操作:
frequencies['cat'] = frequencies['cat'] + 1
该行告诉ruby计算=
符号右侧的结果,然后将结果分配给frequencies['cat']
:
frequencies['cat'] = frequencies['cat'] + 1
|
V
0 + 1 = 1
因为频率Hash中不存在'cat'键,frequencies['cat']
返回0,结果1被分配给frequencies['cat']
。这让你:
frequencies = {'cat' => 1}
下一次通过each()
循环,执行以下行:
frequencies['dog'] = frequencies['dog'] + 1
|
V
0 + 1 = 1
因为频率Hash中不存在'dog'键,frequencies['dog']
返回0,结果1被分配给frequencies['dog']
,这样就离开了:
frequencies = {'cat' => 1, 'dog' => 1}
下一次通过each()
循环,你得到:
frequencies['cat'] = frequencies['cat'] + 1
|
V
1 + 1 = 2
由于'cat'键存在于频率Hash中,因此返回'cat'键的值,结果2被分配给frequencies['cat']
。这让你:
frequencies = {'cat' => 2, 'dog' => 1}
通过each()
循环的最后时间,您得到:
frequencies['mouse'] = frequencies['mouse'] + 1
|
V
0 + 1 = 1
由于频率哈希中不存在“鼠标”键,frequencies['mouse']
返回0,结果1被分配给frequencies['mouse']
。这让你:
frequencies = {'cat' => 2, 'dog' => 1, 'mouse' => 1}
因此,当您使用Hash.new(0)
创建哈希并查找不存在的密钥时,您会得到0,但如果查找存在的密钥,则会获得与该密钥关联的实际值哈希。