数组和散列中的循环

时间:2018-01-20 16:43:57

标签: arrays ruby hash

我无法理解循环是如何工作的,即它如何找到相似的单词并增加散列中的值:

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  
}

2 个答案:

答案 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

注意:

可以使用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,但如果查找存在的密钥,则会获得与该密钥关联的实际值哈希。