通过数组迭代数组(另一个Ruby字数)

时间:2015-02-09 10:37:02

标签: ruby-on-rails ruby arrays

在确定红宝石字数的逻辑时遇到一些麻烦。我的目标是传入一些文本,并获得数组中定义的某类词的总数。因此,如果我提供以下变量,我想找出所提及的与水果有关的单词:

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。

5 个答案:

答案 0 :(得分:1)

Fruit#each只是迭代水果,而你可能想要收集价值。 map来救援:

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

您是否需要fruit ⇒ count的哈希值,这很简单:

result = Hash[result]

希望它有所帮助。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

您可能想尝试尝试一些其他方法。特别是countmap看起来很有希望:

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,因此我们只需添加一个