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

Laut meiner Anforderung möchte ich die in den aggFilters angegebenen Muster mit aggCodeVal vergleichen. Das erste Muster "IR *" ist eine Übereinstimmung mit "IR_CS_BPV", aber nicht das zweite, daher möchte ich nach dem Finden der Übereinstimmung aus der for-Schleife ausbrechen, so dass ich nicht für die zweite "IR_" gehe. Ich möchte keine Break-Anweisung wie Java verwenden.Ich möchte eine Übereinstimmung von Array of String mit einem einzelnen String in scala mattern?

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 
    } 

Antwort

0

können Sie die eingebaute in exists-Methode verwenden, um es für Sie zu tun.

Extrahieren Sie eine Funktion, die einen einzelnen Filter, mit dieser Signatur vergleicht:

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

Und dann: wie

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

Die Implementierung von compareFilter, BTW kann, verkürzt werden, um etwas:

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) 
} 

Aber - überprüfen Sie mich darauf, nicht sicher, ob ich Ihrer Logik vollkommen gefolgt bin.

1

Wenn * Ihr einziges Wildcard-Zeichen ist, sollten Sie in der Lage sein, Regex für Ihre Match-Tests zu nutzen.

+0

funktioniert nicht .. compareFilter (Array ("IR _", "ABC *"), "IR_ABC") gibt true zurück, sollte aber false zurückgeben. –

+0

Das liegt daran, dass das Muster ABC * mit den letzten 3 Zeichen der Zielzeichenfolge übereinstimmt. Die Wildcard '*' wird als "null oder mehr zusätzliche Zeichen" verstanden. Wenn Sie es brauchen, um "ein oder mehrere zusätzliche Zeichen" zu bedeuten, dann ändern Sie die 'replace()' von '. *' Zu '. +'. Wenn andererseits "false" zurückgegeben werden soll, weil die Zielzeichenfolge nicht mit "ABC" beginnt, dann ändern Sie die Regex in "^ $ f $$" '. – jwvh

+0

Mit den wenigen zur Verfügung gestellten Beispielen war ich nicht sicher, was die genauen Anforderungen für den Mustervergleich waren, aber die 'Regex'-Bibliothek ist ziemlich flexibel, so dass sie wahrscheinlich an Ihre Bedürfnisse angepasst werden kann. – jwvh

Verwandte Themen