我有一个数组:
array = ['Footballs','Baseball','football','Soccer']
我需要计算看到足球或棒球的次数,无论情况和复数。
这是我试图做的,但没有运气:
array.count { |x| x.downcase.include? 'football' || x.downcase.include? 'baseball' }
编写此代码的正确或更好的方法是什么?我正在寻找3作为答案。
答案 0 :(得分:9)
我会使用count
结合一个块来检查每个元素与正在寻找的约束匹配的正则表达式。在这种情况下:
array.count { |element| element.match(/(football|baseball)s?\Z/i) }
这将匹配以下任何元素:足球,足球,棒球,棒球。
s?
使's'可选,i
选项(/i
)使表达式不区分大小写,\Z
选项检查结束字符串。
您可以在Ruby文档中详细了解Regexp:http://www.ruby-doc.org/core-2.0.0/Regexp.html
使用Regexps的一个很好的工具是Rubular:http://rubular.com/
答案 1 :(得分:1)
如果给一个数组的count方法一个块,它会迭代数组并计算你返回true的值:
array.count do |x|
(x.downcase.include? 'footbal') || (x.downcase.include? 'baseball')
end
答案 2 :(得分:0)
您可以使用inject
计算每个项目并返回结果。
array = ['Football','Baseball','football','Soccer']
count = array.inject({}) do |counter, item|
counter[item.downcase] ||= 0
counter[item.downcase] += 1
counter
end
# => {"football"=>2, "baseball"=>1, "soccer"=>1}
如果您需要计算单个值,则更简单。
array = ['Football','Baseball','football','Soccer']
count = array.inject(0) do |counter, item|
counter += (item.downcase == 'football' ? 1 : 0)
end
在一行
array = ['Football','Baseball','football','Soccer']
count = array.inject(0) { |counter, item| counter += (item.downcase == 'football' ? 1 : 0) }
要包含复数,只需加强比较。
答案 3 :(得分:0)
假设你为singularize
方法安装了Ruby on Rails(你实际上不需要在rails中运行它):
require 'active_support/inflector'
array = ['Footballs','Baseball','football','Soccer']
uniq = array.map { |s| s.downcase.singularize }.uniq
uniq.size # => 3
答案 4 :(得分:0)
使用Rails
和Ruby >= 2.7
,您可以执行以下操作:
array = ['Footballs','Baseball','football','Soccer']
array.map(&:downcase).map(&:singularize).tally
=> {"football"=>2, "baseball"=>1, "soccer"=>1}