2015-02-09 72 views
0

在计算ruby字数的逻辑时遇到一些麻烦。我的目标是传入一些文本,并获得数组中定义的某个类别的单词的总数。所以,如果我给下面的变量,我想找出有什么水果提到的词的分数:通过数组遍历数组(另一个Ruby字数)

content = "I went to the store today, and I bought apples, eggs, bananas, 
yogurt, bacon, spices, milk, oranges, and a pineapple. I also had a fruit 
smoothie and picked up some replacement Apple earbuds." 

fruit = ["apple", "banana", "fruit", "kiwi", "orange", "pear", "pineapple", "watermelon"] 

(我知道复数/奇异的是不相符的;只是一个例子)。这是我一直在试图代码:

content.strip 
contentarray = content.downcase.split(/[^a-zA-Z]/) 
contentarray.delete("") 
total_wordcount = contentarray.size 

IRB测试:

contentarray.grep("and") 
=> ["and", "and", "and"] 
contentarray.grep("and").count 
=> 3 

于是我尝试:

fruit.each do |i| 
    contentarray.grep(i).count 
end 
=> ["apple", "banana", "fruit", "kiwi", "orange", "pear", "pineapple", "watermelon"] 

它只是返回数组,没有计数。如果它返回任何数字,我会将它们全部添加。我们的目标是要结束了:

fruitwordcount 
=> 6/33 

=> .1818181 

我试着搜索,发现有很多的方法说的内容数组转换成散列计数出现许多教程做的,但是当我只需要一个子集的计数时,就会给出每个单词的计数。我似乎无法找到通过字符串数组搜索数组或字符串的好方法。我发现一些文章说要使用来自Multiset gem的直方图,但这仍然给每一个字。任何帮助将非常感激;请原谅我的nberbery。

回答

0

您正在查找的方法是map而不是eacheach为数组中的每个元素执行块,然后返回原始数组。 map创建一个包含块返回值的新数组。

fruit.map do |i| 
    contentarray.grep(i).count 
end 
=> [1, 0, 1, 0, 0, 0, 1, 0] 
+0

作品就像一个冠军。谢谢! – Rootski 2015-02-09 11:02:50

+0

不客气。您现在可以[接受答案](http://stackoverflow.com/help/someone-answers),您认为这是解决问题的最佳方案。 – cbliard 2015-02-10 08:09:18

1

Fruit#each只是重复的水果,而你可能想收集价值。 map就派上用场了:

result = fruit.map do |i| 
    [i, contentarray.grep(i).count] 
end 

无论您需要的fruit ⇒ count哈希,它很简单:

result = Hash[result] 

希望它能帮助。

0

这是因为each方法只是迭代和执行该块。使用mapcollect来执行该块并返回一个数组。

result = fruit.map { |i| counterarray.grep(i).count } 
0

array#每个返回数组本身as per ruby docs

你可能想尝试给一些其他方法一试。特别是countmap看好:

fruit.map do |f| 
    contentarray.count{|content| content == f} 
end 
0

得到公正的水果让你的阵列 - contentarray.keep_if{|x| fruit.include?(x) }然后把它变成一个哈希计数你发现教程做的方式。

或者只是使用在contentarray注入构建hash

contentarray.inject(Hash.new(0)) do |result, element| 
    if fruit.include?(element) 
    result[element] += 1 
    end 
    result 
end 

Hash.new(0)设置默认值设置为0,所以我们只需要添加一个