2009-12-09 2 views
7
def l = ["My", "Homer"] 
String s = "Hi My Name is Homer" 

def list = s.split(" ") 
println list 

list.each{it -> 
    l.each{it1 -> 
     if (it == it1) 
      println "found ${it}" 
    } 
} 

voglio verificare se grande lista (list) contiene tutti gli elementi della sottolista (l) Vuol Groovy ha nessun costruito in metodi per controllare questo o quello che ho nel il codice sopra farà?Come verificare se un elenco contiene un elenco secondario

risposta

18

È possibile utilizzare il metodo Collection.intersect(Collection right) di Groovy e verificare se la raccolta restituita è grande quanto quella passata come argomento.

si deve utilizzare il metodo String.tokenize(), prima di generare un elenco dalla stringa invece di String.split() che restituisce un array di stringhe:

def sublist = ["My", "Homer"] 
def list = "Hi My Name is Homer".tokenize() 

assert sublist.size() == list.intersect(sublist).size() 

In alternativa, è possibile utilizzare il metodo di Groovy Object.every(Closure closure) e verificare se ogni elemento della elenco secondario è contenuto nella lista:

assert sublist.every { list.contains(it) } 

Tuttavia, la via più breve sta usando l'API standard di Java Collection:

assert list.containsAll(sublist) 
-2

La soluzione funzionerà. Assicurati di considerare lo Knuth–Morris–Pratt algorithm se hai a che fare con array di grandi dimensioni con relativamente pochi valori discreti.

+0

Non stava chiedendo se la sua soluzione avrebbe funzionato o no, stava chiedendo se ci fossero delle funzioni incorporate che potrebbe usare per farlo invece. – Gord

+0

Non ne sono a conoscenza. – Matthew

7

Il metodo più semplice è solo per chiamare:

list.containsAll(l) 

Potete trovare ulteriori informazioni su di esso qui: Groovy Collections