2010-03-30 18 views
19

Wie kann ich die Elemente in zwei Listen vergleichen und eine neue Liste mit dem Unterschied in Groovy erstellen?Wie kann ich zwei Listen in Groovy vergleichen

+0

Sie müssen sagen, was Sie mit „Differenz“ bedeuten. Ist die Reihenfolge wichtig? Sind mehrere Kopien wichtig? – John

+0

Meinst du die exklusive Trennung zwischen zwei Listen? d.h. https://en.wikipedia.org/wiki/Exclusive_or –

Antwort

31

Sammlungen Schnittpunkt könnte Ihnen dabei helfen, auch wenn es ein wenig schwierig ist, es umzukehren. Vielleicht so etwas wie:

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

Ich würde nur die arithmetischen Operatoren verwenden, halte ich es für viel mehr offensichtlich ist, was los ist:

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

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

Ich gehe davon aus dem OP für die exclusive disjunction zwischen zwei Listen bittet ?

(Hinweis: Keines der bisherigen Lösungen behandeln Duplikate!)

Wenn Sie es selbst in Groovy codieren wollen, gehen Sie wie folgt vor:/

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 

Eine gotcha, wird mit Listen Arrays von Ints. Sie haben (möglicherweise) Probleme wegen der polymorphen Methode remove (int) vs remove (Object). See here for a (untested) solution.

Anstatt das Rad neu zu erfinden, aber, sollten Sie nur eine vorhandene Bibliothek (z commons-collections) verwenden:

@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'] 
Verwandte Themen