在确定红宝石字数的逻辑时遇到一些麻烦。我的目标是传入一些文本,并获得数组中定义的某类词的总数。因此,如果我提供以下变量,我想找出所提及的与水果有关的单词:
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中的直方图,但是它仍然会给出每一个字。任何帮助将非常感谢;请原谅我的n00bery。
答案 0 :(得分:1)
Fruit#each
只是迭代水果,而你可能想要收集价值。 map
来救援:
result = fruit.map do |i|
[i, contentarray.grep(i).count]
end
您是否需要fruit ⇒ count
的哈希值,这很简单:
result = Hash[result]
希望它有所帮助。
答案 1 :(得分:0)
您要查找的方法是map
,而不是each
:each
为数组中的每个元素执行块,然后返回原始数组。 map
创建一个包含块返回值的新数组。
fruit.map do |i|
contentarray.grep(i).count
end
=> [1, 0, 1, 0, 0, 0, 1, 0]
答案 2 :(得分:0)
这是因为each
方法只是迭代并执行块。使用map
或collect
执行块并返回一个数组。
result = fruit.map { |i| counterarray.grep(i).count }
答案 3 :(得分:0)
array#each返回数组本身as per ruby docs。
您可能想尝试尝试一些其他方法。特别是count和map看起来很有希望:
fruit.map do |f|
contentarray.count{|content| content == f}
end
答案 4 :(得分:0)
要获得结果,只需获得数组 - contentarray.keep_if{|x| fruit.include?(x) }
,然后按照您发现教程的方式将其转换为哈希计数。
或者只需在contentarray
上使用注入来构建哈希
contentarray.inject(Hash.new(0)) do |result, element|
if fruit.include?(element)
result[element] += 1
end
result
end
Hash.new(0)
将默认值设置为0,因此我们只需添加一个