我有一个这样的数组:
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"]
我的思维过程是做这样的事情:
"bar"
但是,这个过程看起来很糟糕。有一种聪明的方法吗?
答案 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)
如果这是你的数组声明:
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语法可能不准确。