2016-04-27 63 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