如果对象包含值,则为Ruby Count Array对象

时间:2013-12-04 21:13:50

标签: ruby arrays count

我有一个数组:

array = ['Footballs','Baseball','football','Soccer']

我需要计算看到足球或棒球的次数,无论情况和复数。

这是我试图做的,但没有运气:

array.count { |x| x.downcase.include? 'football' || x.downcase.include? 'baseball' }

编写此代码的正确或更好的方法是什么?我正在寻找3作为答案。

5 个答案:

答案 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)

使用RailsRuby >= 2.7,您可以执行以下操作:

array = ['Footballs','Baseball','football','Soccer']
array.map(&:downcase).map(&:singularize).tally
=> {"football"=>2, "baseball"=>1, "soccer"=>1}