2016-07-23 24 views
0

Wenn ich zwei String-Listen wie unten habe und eine neue String-Liste basierend auf startsWith Logik erstellen möchte, wie kann ich das tun?Wie filtere ich zwei Listen und erstelle eine neue Liste

pathList = ["/etc/passwd/something.txt", 
      "/etc/fonts/fonts.conf" 
      "/var/www/foo.bar", 
      "/some/foo/path/one.txt"] 
notAllowedPathList = ["/etc/fonts", 
         "/var", 
         "/path"] 

newList = ["/etc/passwd/something.txt", "/some/foo/path/one.txt"] 

newList wird erstellt, indem in pathListstartsWith jedes Element in newList ob jedes Element zu sehen.

Also, von den oben pathList, /etc/fonts/fonts.conf und /var/www/foo.bar entfernt werden, weil sie /etc/fonts und /var jeweils startWith.

kam ich mit unten, aber ich glaube, es wäre eine groovy Art und Weise sein, dies zu tun:

def newList = [] 
    pathList.each {String fileName -> 
     notAllowedPathList.find { String notAllowed -> 
      if (fileName.startsWith(notAllowed)) { 
       return true 
      } 
      else { 
       newList << fileName 
      } 
     } 
    } 

Antwort

0
def pathList = [ 
    "/etc/passwd/something.txt", 
    "/etc/fonts/fonts.conf", 
    "/var/www/foo.bar", 
    "/some/foo/path/one.txt" 
] 

def notAllowedPathList = ["/etc/fonts", "/var", "/path"] 

def newList = pathList.findAll { String fileName -> 
    !notAllowedPathList.any { 
     fileName.startsWith(it) 
    } 
} 
+0

wow ich nicht 'wusste' kann 'any' vorangestellt werden. Kannst du mir bitte erklären, was es macht? – Anthony

+0

'any' gibt true zurück, wenn ein Element der Sammlung, auf das es aufgerufen wird, einen truthigen Wert zurückgibt, wenn es an das closure-Argument übergeben wird –

Verwandte Themen