Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 我如何在字符串中找到一类单词,并用Ruby计算它们的计数?_Arrays_Ruby_String - Fatal编程技术网

Arrays 我如何在字符串中找到一类单词,并用Ruby计算它们的计数?

Arrays 我如何在字符串中找到一类单词,并用Ruby计算它们的计数?,arrays,ruby,string,Arrays,Ruby,String,给定一个句子,我想计算一类名词(人与动物)出现的总次数。这与找出每个单词出现的次数不同。我也不是在寻找每个指定单词出现的总次数,而是一个数组中所有指定单词出现的总次数。虽然先进的方法受到赞赏,但搜索更简单更初级的编码;一行代码可能是伟大的,衷心感谢,但我想有一个初学者的理解 在“约翰和玛丽喜欢马、鸭子和狗”这句话中,我想统计一下动物的数量(3) str=“约翰和玛丽喜欢马、鸭子和狗。” 动物=[“马”、“鸭”、“狗”] def计数_a(字符串) 动物=0 i=0 而我

给定一个句子,我想计算一类名词(人与动物)出现的总次数。这与找出每个单词出现的次数不同。我也不是在寻找每个指定单词出现的总次数,而是一个数组中所有指定单词出现的总次数。虽然先进的方法受到赞赏,但搜索更简单更初级的编码;一行代码可能是伟大的,衷心感谢,但我想有一个初学者的理解

在“约翰和玛丽喜欢马、鸭子和狗”这句话中,我想统计一下动物的数量(3)

str=“约翰和玛丽喜欢马、鸭子和狗。”
动物=[“马”、“鸭”、“狗”]
def计数_a(字符串)
动物=0
i=0
而我
预期:3
实际:不显示任何回报

您的代码一次只能工作一个字母:

"abcd"[0]
=> "a"
然后,您的条件将该字母与单词进行比较:

"abcd"[0] == "duck"
# which is the same as:
"a" == "duck"
# which will never be true
您可以将字符串拆分为一个单词数组,并使用
array#count
array#include?
来计算出现次数:

ANIMALS = ["horses", "ducks", "dogs"]

def count_a(string)
  string.split(/\b/).count { |word| ANIMALS.include?(word) }
end

puts count_a("John and Mary like horses, ducks, and dogs.")
要搜索单词内部的匹配项,如“bulldog”作为狗计数,您可以使用:

def count_a(string)
  ANIMALS.inject(0) { |count, animal| count + string.scan(animal).size }
end

您的代码一次只能工作一个字母:

"abcd"[0]
=> "a"
然后,您的条件将该字母与单词进行比较:

"abcd"[0] == "duck"
# which is the same as:
"a" == "duck"
# which will never be true
您可以将字符串拆分为一个单词数组,并使用
array#count
array#include?
来计算出现次数:

ANIMALS = ["horses", "ducks", "dogs"]

def count_a(string)
  string.split(/\b/).count { |word| ANIMALS.include?(word) }
end

puts count_a("John and Mary like horses, ducks, and dogs.")
要搜索单词内部的匹配项,如“bulldog”作为狗计数,您可以使用:

def count_a(string)
  ANIMALS.inject(0) { |count, animal| count + string.scan(animal).size }
end
将Regexp更改为

Regexp.new(animals.join("|"), true)
用于不区分大小写的匹配

将Regexp更改为

Regexp.new(animals.join("|"), true)

对于不区分大小写的匹配。

保留您的逻辑,如下所示进行修复(请参阅内联注释):

def count_a(字符串)

string=string.scan(/\w+/).map(&:downcase)#保持逻辑,像这样修复(请参阅内联注释):

def count_a(字符串)

string=string.scan(/\w+/).map(&:downcase)#@AlekseiMatiushkin谢谢,编辑:)。我不确定是否可以以任何合理的方式使union不区分大小写。我可以想到
Regexp.new(Regexp.union(…),[1])
/#{Regexp.union(…)}/I
,但这两种方法看起来都不够合理。另外,劫持
Regexp.union(…).options
似乎是不可能的。@AlekseiMatiushkin谢谢,编辑:)。我不确定是否可以以任何合理的方式使union不区分大小写。我可以想到
Regexp.new(Regexp.union(…),[1])
/#{Regexp.union(…)}/I
,但这两种方法看起来都不够合理。此外,劫持
Regexp.union(…).options
似乎是不可能的。可能重复的