计算数组中模式的出现次数

时间:2016-07-31 02:29:36

标签: arrays ruby

我有一个这样的数组:

a= ["foo", "bar", "baz", "foo", "bar", "baz", "foo", "bar", "BAD," "baz"]

如您所见,数组中有重复的模式:

"foo", "bar", "baz" 

直到它在模式“BAD”中的最后一个模式。

我想要一种方法来查找模式'“foo”,“bar”,“baz”'的最后一次出现,因为我只对 last 元素不感兴趣图案。

我期望返回的是这样的

array_after_some_method(a) => ["foo", "bar", "BAD", "baz"]

我的思维过程是做这样的事情:

  1. 将数组转换为字符串
  2. 以模式分割
  3. 计算"bar"
  4. 的出现次数

    但是,这个过程看起来很糟糕。有一种聪明的方法吗?

3 个答案:

答案 0 :(得分:0)

您可能想稍微修改一下您的问题;我发现这个措辞有点令人困惑。

然而,我认为你正在寻找这样的东西:

array = ["foo", "bar", "bar", "baz"]

def useful_method(array, str)
  array.select { |member| 
    member == str
  }.length
end

useful_method array, 'bar' # => 2

答案 1 :(得分:0)

如果您将重复模式定义为以'foo'开头,则可以使用:

a.slice_before(a.first).map { |ary| ary }.last

但是,如果模式中有多个'foo',则只会获得最后一个def last_pattern(arr) arr .chunk { |x| x } # group by value .slice_before { |x| x.first == arr.first } # find pattern based on first element in arr .to_a # turn enumerator into Array .last # take only the last pattern .flat_map(&:last) # join the chunked elements back end last_pattern(a) # => ["foo", "bar", "bar", "bad"] 。要捕获整个模式,您可以尝试:

Enumerable#count

然后只需使用last_pattern(a).count { |x| x == 'bar' } # => 2 来计算特定元素:

Hash[last_pattern(a).group_by { |x| x }.map { |k, v| [k, v.length] }]
# => {"foo"=>1, "bar"=>2, "baz"=>1}

甚至可以使用Enumerable#group_by计算它们:

foo.forEach_bar(out_array);

答案 2 :(得分:0)

我自己也是一个新的红宝石爱好者,现在正在学习红宝石的方法。我知道c ++和其他语言的基本编程知识。我认为你可以做的是在ruby中使用.length方法(或函数)查找数组的长度。然后使用for循环并遍历每个索引:

如果这是你的数组声明:

array = ["foo", "bar", "baz","foo", "bar"]

那么你的for循环将如下所示:

for array [, variable ...] in expression [do]
   if (variable = array[index#])
    count++; //count is used to increment the count token to keep track of the occurences of "bar", or "foo" and other array elements
   end
end

但确切的Ruby语法可能不准确。