web-dev-qa-db-fra.com

Comment comparer deux listes dans Groovy

Comment comparer les éléments de deux listes et créer une nouvelle liste avec la différence dans Groovy?

20
user304966

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
37
Daff

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))
47
Ted Naleid

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']
10
Nick Grealy

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]
0
Mate Mrše