2010-03-30 45 views
19

¿Cómo puedo comparar los artículos en dos listas y crear una nueva lista con la diferencia en Groovy?¿Cómo puedo comparar dos listas en Groovy

+0

Es necesario decir lo que quiere decir con "diferencia". Es importante la orden? ¿Son importantes las copias múltiples? – John

+0

¿Te refieres a la disyunción exclusiva entre dos listas? es decir, https://en.wikipedia.org/wiki/Exclusive_or –

Respuesta

31

Las colecciones se cruzan pueden ayudarte con eso incluso si es un poco complicado revertirlo. Tal vez algo como esto:

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

que acababa de utilizar los operadores aritméticos, creo que es mucho más evidente lo que está pasando:

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

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

Asumo el PO está pidiendo los exclusive disjunction entre dos listas ?

(Nota: Ninguna de las soluciones anteriores manejar duplicados!)

Si desea codificar por sí mismo en Groovy, haga lo siguiente:

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 

Un gotcha, es el uso de listas/matrices de ints. Usted (puede) tener problemas, debido al método polimórfico remove (int) vs remove (Object). See here for a (untested) solution.

vez de reinventar la rueda embargo, sólo debe utilizar una biblioteca existente (por ejemplo 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'] 
Cuestiones relacionadas