通过数组遍历数组(另一个Ruby字数)
问题描述:
在计算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。
答
Fruit#each
只是重复的水果,而你可能想收集价值。 map
就派上用场了:
result = fruit.map do |i|
[i, contentarray.grep(i).count]
end
无论您需要的fruit ⇒ count
哈希,它很简单:
result = Hash[result]
希望它能帮助。
答
这是因为each
方法只是迭代和执行该块。使用map
或collect
来执行该块并返回一个数组。
result = fruit.map { |i| counterarray.grep(i).count }
答
array#每个返回数组本身as per ruby docs。
你可能想尝试给一些其他方法一试。特别是count和map看好:
fruit.map do |f|
contentarray.count{|content| content == f}
end
答
得到公正的水果让你的阵列 - 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,所以我们只需要添加一个
作品就像一个冠军。谢谢! – Rootski 2015-02-09 11:02:50
不客气。您现在可以[接受答案](http://*.com/help/someone-answers),您认为这是解决问题的最佳方案。 – cbliard 2015-02-10 08:09:18