2016-02-02 13 views
0

子我有一個數組:對陣陣

my_arr = ["PR", "PM", "EM", "SM", "ST"] 

和一個字符串:

my_str = "5012PR152" 

我想看看該字串是否包括任何數組中的字符串。如果數組中的字符串只是一個,這會工作:

my_str.include?("PR") 

,但我不能字符串數組作爲參數傳遞給include?。我怎麼去解決這個問題?

+0

歡迎使用堆棧溢出。閱讀「[問]」和「[mcve]」。我們需要看到你解決問題的嘗試。這並沒有表現出太多的努力,這很重要。 http://meta.stackoverflow.com/q/261592/128421 –

回答

1
my_arr.inject(false) { |m, e| m ||= my_str.include? e } 

這將返回正確的答案,但缺乏提前;我沒有看到一個精闢的方式來獲得這個。

或者,它可能是有趣的猴子補丁String此...

class String 
    def anyinclude? a 
    a.each do |e| 
     if include? e 
     return true 
     end 
    end 
    return false 
    end 
end 

my_arr = ["PR", "PM", "EM", "SM", "ST"] 
p "5012PR152".anyinclude? my_arr 
+1

這真棒的一部分將是我可以返回'E',而不是真正的,如果有一場比賽。 – idalsin

+1

好主意,在這種情況下,返回nil而不是false。 – DigitalRoss

0

試試這個

def include_substring(str, arr) 
    str.chars.each_cons(2).to_a.any? { |a,b| arr.include?([a,b].join('')) } 
end 

include_substring('5012PR152', ['PR', QZ']) 
=> true 

擊穿

chars - 將一個字符串轉換爲每個字符數組

each-cons(2) - 分區此陣爲兩個

any?塊查找是否存在陣列中的元素符合以下條件

在下面的塊中,我們想要傳入兩個元素作爲參數,並查看組合數組是否包含上述兩個元素的連接。

3

您可以使用可枚舉的方法any?這需要一個塊,如果任何一個結果是什麼,但將返回true假/爲零。

然後,您可以在塊中使用您的my_arr數組,以便使用indlude?()方法檢查字符串。

這最終會看起來像這樣:

my_arr.any? { |a| my_string.include?(a) }

或者,您可以創建將爲你做這個以備將來使用的方法。這可能是這個樣子:

class String 
    def any_include?(array) 
    array.any? { |a| include?(a) } 
    end 
end 

,你可以在一個字符串調用與my_str.any_include?(my_arr)

2.1.2 :001 > class String 
2.1.2 :002?>  def any_include?(array) 
2.1.2 :003?>   array.any? { |a| include?(a) } 
2.1.2 :004?>  end 
2.1.2 :005?> end 
=> :any_include? 
2.1.2 :006 > my_arr = ["PR", "PM", "EM", "SM", "ST"] 
=> ["PR", "PM", "EM", "SM", "ST"] 
2.1.2 :007 > my_str = "5012PR152" 
=> "5012PR152" 
2.1.2 :008 > my_str.any_include?(my_arr) 
=> true 
+0

請不要折騰代碼。解釋爲什麼代碼是有用的,爲什麼你的答案效果最好。不要給某人一條魚,教他們如何釣魚。 –

0
my_arr = ["PR", "PM", "EM", "SM", "ST"] 

r = Regexp.union(my_arr) 
    # => /PR|PM|EM|SM|ST/ 

["5012PR152", "5512ST011", "5012ME031"].map { |s| !!(s =~ r) } 
    #=> [true, true, false] 

!一個truthy值(任何其它nilfalse)轉換爲false和falsy值(nilfalse)至true。因此,!!將真實值轉換爲true並將虛假值轉換爲false。您可以選擇將塊編寫爲

{ |s| s =~ r ? true : false }