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

Tôi muốn kiểm tra xem danh sách lớn (list) chứa tất cả các yếu tố của sublist (l) Liệu groovy có bất kỳ được xây dựng trong các phương pháp để kiểm tra này hoặc những gì tôi có trong mã trên sẽ làm gì?làm thế nào để kiểm tra xem một danh sách chứa một sublist

Trả lời

18

Bạn có thể sử dụng phương thức Collection.intersect(Collection right) của Groovy và kiểm tra xem Bộ sưu tập được trả về có lớn bằng bộ sưu tập được chuyển làm đối số hay không.

Bạn phải sử dụng các phương pháp String.tokenize() trước để tạo ra một danh sách từ String thay vì String.split() mà trả về một mảng String:

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

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

Ngoài ra, bạn có thể sử dụng phương pháp Object.every(Closure closure) Groovy và kiểm tra xem mỗi phần tử của sublist được chứa trong danh sách:

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

Tuy nhiên, con đường ngắn nhất là sử dụng các tiêu chuẩn Java API thu thập:

assert list.containsAll(sublist) 
-2

Giải pháp của bạn sẽ hoạt động. Hãy chắc chắn để xem xét các Knuth–Morris–Pratt algorithm nếu bạn đang đối phó với mảng lớn của tương đối ít giá trị rời rạc.

+0

Ông không hỏi nếu giải pháp của ông sẽ làm việc hay không, ông được hỏi nếu có bất kỳ chức năng tích hợp nào mà anh có thể sử dụng để thực hiện việc này thay thế. – Gord

+0

Tôi không biết về bất kỳ điều gì. – Matthew

7

Phương pháp đơn giản nhất là chỉ cần gọi:

list.containsAll(l) 

Bạn có thể tìm thêm thông tin về nó ở đây: Groovy Collections