2009-12-09 27 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}" 
    } 
} 

Chcę sprawdzić, czy duże liście (list) zawiera wszystkie elementy podmenu (l) Czy Groovy posiada wbudowanych metod, aby sprawdzić czy to, co mam w powyższy kod zrobi?jak sprawdzić, czy lista zawiera podmenu

Odpowiedz

18

Można użyć metody Groovy'ego Collection.intersect(Collection right) i sprawdzić, czy zwrócona kolekcja jest tak duża jak ta, która została przekazana jako argument.

Musisz użyć metody String.tokenize() wcześniej, aby wygenerować listę z łańcucha zamiast String.split() która zwraca tablicę ciągów:

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

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

Alternatywnie, można użyć Object.every(Closure closure) metodę Groovy i sprawdzić, czy każdy element podlistę jest zawarty w liście:

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

jednak najkrótsza droga jest przy użyciu standardowego API Java Collection:

assert list.containsAll(sublist) 
-2

Twoje rozwiązanie zadziała. Pamiętaj, aby wziąć pod uwagę Knuth–Morris–Pratt algorithm, jeśli masz do czynienia z dużymi tablicami o stosunkowo niewielu dyskretnych wartościach.

+0

On nie pytał, czy jego rozwiązanie będzie działać czy nie, on pytał gdyby istniały jakieś wbudowane funkcje, których mógłby użyć zamiast tego. – Gord

+0

Nie jestem tego świadomy. – Matthew

7

Najprostszym sposobem jest po prostu zadzwonić:

list.containsAll(l) 

można znaleźć więcej informacji na ten temat tutaj: Groovy Collections

Powiązane problemy