2015-10-13 105 views
-1

我試圖在數組中分離某些字符串,例如陣列,如何過濾字符串

["banana man", "apple", "banana woman"] 

其是由所述串(即子串)的起始識別的。我想保留'banana man''banana woman',但刪除'apple'。任何幫助,將不勝感激。

+2

您是否事先知道前綴(例如'「banana」'),還是必須從給定的字符串中提取/識別它? – Stefan

+2

問題根本不明確。 「蘋果」與其他兩個元素隔離的方式是什麼?是否因爲它以'「a」'開頭? – sawa

+1

Beth,如果'a'是你的數組,並且我們按字面解釋你的問題(我們應該),'a.delete(「apple」)'就足夠了(儘管我懷疑你正在尋找什麼)。 –

回答

2

嘗試和select選擇只是那些以字符串開始你想要的:

["banana man", "apple", "banana woman"].select { |i| i.start_with?("bana") } 
=> ["banana man", "banana woman"] 
5

這是grep

ary = ["banana man", "apple", "banana woman"] 
ary.grep(/^banana/) # => ["banana man", "banana woman"] 
+1

雖然'grep'導致了一個視覺上簡單的表達,但基準測試顯示它的代價很高。 –

+0

謝謝,這工作出色,性能尚未提出作爲一個問題,但該計劃,所以我會繼續使用grep。 – Beth

1

基準時間有很大的用例:

require 'fruity' 

ARY = ["banana man", "apple", "banana woman"] 

ARY.grep(/^banana/) # => ["banana man", "banana woman"] 
ARY.select { |i| i.start_with?("bana") } # => ["banana man", "banana woman"] 

compare do 
    grep_only { ARY.grep(/^banana/) } 
    select_start_with { ARY.select { |i| i.start_with?("bana") } } 
end 
# >> Running each test 4096 times. Test will take about 1 second. 
# >> select_start_with is faster than grep_only by 3x ± 1.0 

延伸ARY

ARY = ["banana man", "apple", "banana woman"] * 1000 

compare do 
    grep_only { ARY.grep(/^banana/) } 
    select_start_with { ARY.select { |i| i.start_with?("bana") } } 
end 
# >> Running each test 8 times. Test will take about 1 second. 
# >> select_start_with is faster than grep_only by 3x ± 0.1 
+0

謝謝你的基準。有趣的是下一個最快的方法(〜一半速度),我可以找到實際上是加入和掃描(這看起來容易出錯,取決於規格)。 – engineersmnky

+0

然後將其添加到組合中。這是一個社區wiki的原因。 –

0

在錫芒遺志,並且由於自己的實際規格是非常模糊的,我會添加這種替代解決方案作爲可能的,但可能容易出錯的選擇。

ARY = ["banana man", "apple", "banana woman"] 
ARY.join(' ').scan(/banana\s\w+/) 
#=> ["banana man", "banana woman"] 

這將出執行grep,但是是select和組合大約一半的速度,僅立足崗位,而不是你的潛在的潛在意圖。