2010-03-30 20 views
19

Come posso confrontare gli articoli in due elenchi e creare un nuovo elenco con la differenza in Groovy?Come posso confrontare due elenchi in Groovy

+0

È necessario dire che cosa si intende per "differenza". L'ordine è importante? Le copie multiple sono importanti? – John

+0

Intendi la disgiunzione esclusiva tra due elenchi? vale a dire https://en.wikipedia.org/wiki/Exclusive_or –

risposta

31

Le raccolte intersecate potrebbero aiutarti in questo, anche se è un po 'complicato invertirlo. Forse qualcosa di simile:

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

mi basta usare gli operatori aritmetici, penso che sia molto più evidente quello che sta succedendo:

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

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

Suppongo che il PO sta chiedendo i exclusive disjunction tra due liste ?

(Nota: Nessuna delle soluzioni precedenti gestire i duplicati!)

Se si vuole codificare da soli in Groovy, procedere come segue:

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 

Uno Gotcha, sta utilizzando gli elenchi/matrici di interi. Si (può) avere problemi, a causa del metodo polimorfico remove (int) vs remove (Object). See here for a (untested) solution.

Invece di reinventare la ruota tuttavia, si dovrebbe utilizzare una libreria esistente (ad esempio 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']