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