2016-07-31 87 views
-2

我有一个这样的数组:计数出现在阵列

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

,你可以看到,有一个数组中的重复图案:

"foo", "bar", "baz" 

,直到最后一个模式它的模式是“坏”。

我想一个方法来寻找模式的最后出现的“‘富’,‘酒吧’,‘巴兹’”因为我只在不遵循模式的最后元素感兴趣。

我期望返回是这样的

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

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

  1. 转阵成字符串
  2. 分裂
  3. 计数出现次数"bar"

但是,这个过程似乎很hacky。有没有一个聪明的方法来做到这一点?

+2

什么是**模式**?它是由人定义还是由程序本身解决? “巴兹”本身就是一种模式吗?如果不是,为什么'[“foo”,“bar”,“bar”,“baz”]'是? – Aetherus

+0

你的问题不清楚,但似乎有趣。您需要通过编辑进行澄清,否则您可能需要更多的投票,然后关闭。最好用文字给出一个完整而明确的问题陈述,但是如果你发现这个问题至少难以举一些例子。使示例尽可能短,显示所需的结果(数字,字符串,数组,散列值,打印值等),并为每个输入对象分配一个变量(如您对'a = [“foo”所做的那样)。 ..'),这样读者就可以在答案和评论中引用这些变量,而不必定义它们。 –

+0

感谢cary ---我现在要编辑。 – user1337902

回答

0

您可能需要修改一下您的问题;我发现措辞有点混乱。

不过,我觉得正在寻找这样的事情:

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

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

useful_method array, 'bar' # => 2 
0

如果定义重复模式与“富”开始这会工作:

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

然而,如果在该模式中有多个'foo' s,则只会得到最后一个。为了捕捉整个模式,你可以试试这个:

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 

甚至指望他们全部使用可枚举#GROUP_BY:

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

这是*很多方法调用。与map {| x,y |有什么关系? [x,y]}'和'map {| x | x}'?那些是没有操作的。 –

+0

好点 - 早期尝试的遗迹。 '''.map {| x | x}'''和'''.to_a'''相同。编辑修复。 – Owen

0

我自己是一个新的红宝石h蛇人,现在正在学习红宝石方法。我通过了解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的语法可能虽然不准确。

+0

塞尔吉奥感谢编辑, 我不知道该怎么做 – Steven