Comment puis-je comparer deux listes dans Groovy

Comment puis-je comparer les éléments de deux listes et créer une nouvelle liste à la différence Groovy?

20
demandé sur user304966 2010-03-30 13:57:03

3 réponses

Collections intersect pourrait vous aider avec cela, même s'il est un peu difficile de l'Inverser. Peut-être quelque chose comme ceci:

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
34
répondu Daff 2010-03-30 10:22:45

Je n'utiliserais que les opérateurs arithmétiques, je pense que c'est beaucoup plus évident ce qui se passe:

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

assert ["bar", "baz", "baz", "qux"] == ((a - b) + (b - a))
47
répondu Ted Naleid 2010-03-31 00:33:50

je suppose que L'OP demande la disjonction exclusive entre deux listes?

( Note: aucune des solutions précédentes ne traite les doublons!)

si vous voulez le coder vous-même dans Groovy, faites ce qui 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

One gotcha, utilise des listes / tableaux d'entrées. Vous (Mai) avoir des problèmes, en raison de la méthode polymorphique supprimer(int) vs supprimer(objet). voir ici pour une solution (non testée) .

au lieu de réinventer la roue cependant , vous devez 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
répondu Nick Grealy 2017-05-23 11:33:17