Comment comparer les éléments de deux listes et créer une nouvelle liste avec la différence dans Groovy?
Les collections se croisent peuvent vous aider, même s’il est un peu difficile de l’inverser. Peut-être quelque chose comme ça:
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
J'utiliserais simplement les opérateurs arithmétiques, je pense que ce qui se passe est beaucoup plus évident:
def a = ["foo", "bar", "baz", "baz"]
def b = ["foo", "qux"]
assert ["bar", "baz", "baz", "qux"] == ((a - b) + (b - a))
Je suppose que le PO demande la disjonction exclusive entre deux listes?
( Remarque: Aucune des solutions précédentes ne gère les doublons!)
Si vous souhaitez le coder vous-même dans Groovy, procédez comme suit:
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 piège, utilise des listes/des tableaux d'ints. Vous pouvez avoir des problèmes en raison de la méthode polymorphe remove (int) vs remove (Object). Voir ici pour une solution (non testée) .
Plutôt que de réinventer la roue , vous devriez simplement utiliser une bibliothèque existante (par exemple, 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']
Si c'est une liste de nombres, vous pouvez faire ceci:
def before = [0, 0, 1, 0]
def after = [0, 1, 1, 0]
def difference =[]
for (def i=0; i<4; i++){
difference<<after[i]-before[i]
}
println difference //[0, 1, 0, 0]