2016-04-27 59 views
0
val aggFilters = Array["IR*","IR_"] 
val aggCodeVal = "IR_CS_BPV" 
val flag = compareFilters(aggFilters,aggCodeVal) 

根據我的要求,我想比較aggFode中給出的模式與aggCodeVal。第一種模式「IR *」與「IR_CS_BPV」匹配,但不是第二種模式,因此我希望在找到匹配之後跳出for循環,這樣我就不會去找第二個「IR_」。我不想使用像java這樣的break語句。我想模式匹配的字符串數組與單個字符串在斯卡拉?

def compareFilters(aggFilters: Array[String], aggCodeVal: String): Boolean = { 
    var flag: Boolean = false 
    for (aggFilter <- aggFilters) { 
     if (aggFilter.endsWith("*") 
      && aggCodeVal.startsWith(aggFilter.substring(0, aggFilter.length() - 1))) { 
     flag = true 
     } 
     else if (aggFilter.startsWith("*") 
       && aggCodeVal.startsWith(aggFilter.substring(1, aggFilter.length()))) { 
     flag = true 
     } 
     else if (((aggFilter startsWith "*") 
       && aggFilter.endsWith("*")) 
       && aggCodeVal.startsWith(aggFilter.substring(1, aggFilter.length() - 1))) { 
     flag = true 
     } 
     else if (aggFilter.equals(aggCodeVal)) { 
     flag = true 
     } 
     else { 
     flag = false 
     } 
    } 
    flag 
    } 

回答

0

您可以使用內置的exists方法爲您做。

提取物,其比較過濾器,與此簽名的函數:

def compareFilter(aggFilter: String, aggCodeVal: String): Boolean 

然後:

def compareFilters(aggFilters: Array[String], aggCodeVal: String): Boolean = { 
    aggFilters.exists(filter => compareFilter(filter, aggCodeVal)) 
} 

compareFilter實施,順便說一句,可以縮短爲類似:

def compareFilter(aggFilter: String, aggCodeVal: String): Boolean = { 
    (aggFilter.startsWith("*") && aggFilter.endsWith("*") && aggCodeVal.startsWith(aggFilter.drop(1).dropRight(1))) || 
    (aggFilter.endsWith("*") && aggCodeVal.startsWith(aggFilter.dropRight(1))) || 
    (aggFilter.startsWith("*") && aggCodeVal.startsWith(aggFilter.drop(1))) || 
    aggFilter.equals(aggCodeVal) 
} 

但是 - 請仔細檢查一下,不確定我是否完全遵循了你的邏輯。

1

如果*是你唯一的通配符,你應該能夠利用Regex做你的匹配測試。

def compareFilters(aggFilters: Array[String], aggCodeVal: String): Boolean = 
aggFilters.exists(f => s"$f$$".replace("*",".*").r.findAllIn(aggCodeVal).hasNext) 
+0

not working .. compareFilter(Array(「IR _」,「ABC *」),「IR_ABC」)返回true,但返回false。 –

+0

這是因爲'ABC *'模式匹配目標字符串的最後3個字符。通配符「*」表示「零個或多個額外字符」。如果你需要它來表示「一個或多個額外的字符」,則將'replace()'從'。*'改爲'。+'。另一方面,如果由於目標字符串沒有用ABC開始,它應該返回'false',然後將正則表達式更改爲'「^ $ f $$」'。 – jwvh

+0

由於提供了有限的示例,我不確定模式匹配的確切要求是什麼,但是'Regex'庫非常靈活,所以它可能會根據您的需求進行調整。 – jwvh