2010-03-30 33 views
19

Làm cách nào để so sánh các mục trong hai danh sách và tạo danh sách mới với sự khác biệt trong Groovy?Làm cách nào để so sánh hai danh sách trong Groovy

+0

Bạn need để say what bạn mean bởi "difference". Đơn đặt hàng có quan trọng không? Có nhiều bản sao quan trọng không? – John

+0

Bạn có nghĩa là sự tách biệt độc quyền giữa hai danh sách? tức là https://en.wikipedia.org/wiki/Exclusive_or –

Trả lời

31

Bộ sưu tập giao nhau có thể giúp bạn với điều đó ngay cả khi hơi khó để đảo ngược nó. Có lẽ một cái gì đó như thế này:

def collection1 = ["test", "a"] 
def collection2 = ["test", "b"] 
def commons = collection1.intersect(collection2) 
def difference = collection1.plus(collection2) 
difference.removeAll(commons) 
assert ["a", "b"] == difference 
44

tôi chỉ cần sử dụng các toán tử số học, tôi nghĩ rằng nó là nhiều hơn nữa rõ ràng những gì đang xảy ra:

def a = ["foo", "bar", "baz", "baz"] 
def b = ["foo", "qux"] 

assert ["bar", "baz", "baz", "qux"] == ((a - b) + (b - a)) 
9

tôi giả OP là yêu cầu cho exclusive disjunction giữa hai danh sách ?

(Lưu ý: Cả trong những giải pháp trước đó xử lý các bản sao!)

Nếu bạn muốn mã đó cho mình trong Groovy, thực hiện như sau:

def a = ['a','b','c','c','c'] // diff is [b, c, c] 
def b = ['a','d','c']   // diff is [d] 

// for quick comparison 
assert (a.sort() == b.sort()) == false 

// to get the differences, remove the intersection from both 
a.intersect(b).each{a.remove(it);b.remove(it)} 
assert a == ['b','c','c'] 
assert b == ['d'] 
assert (a + b) == ['b','c','c','d'] // all diffs 

Một Gotcha, được sử dụng danh sách/mảng ints. Bạn (có thể) có vấn đề, bởi vì phương pháp đa hình loại bỏ (int) vs remove (Object). See here for a (untested) solution.

Rather than reinventing các wheel however, bạn should just dụng an existing library (e.g. commons-collections):

@Grab('commons-collections:commons-collections:3.2.1') 

import static org.apache.commons.collections.CollectionUtils.* 

def a = ['a','b','c','c','c'] // diff is [b, c, c] 
def b = ['a','d','c']   // diff is [d] 

assert disjunction(a, b) == ['b', 'c', 'c', 'd'] 
Các vấn đề liên quan