2016-07-31 86 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