Как я могу сравнить два списка в Groovy - PullRequest
21 голосов
/ 30 марта 2010

Как я могу сравнить элементы в двух списках и создать новый список с разницей в Groovy?

Ответы [ 4 ]

48 голосов
/ 31 марта 2010

Я бы просто использовал арифметические операторы, я думаю, что гораздо более очевидно, что происходит:

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

assert ["bar", "baz", "baz", "qux"] == ((a - b) + (b - a))
38 голосов
/ 30 марта 2010

Пересечение коллекций может помочь вам в этом, даже если немного сложнее повернуть вспять. Может быть, что-то вроде этого:

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
10 голосов
/ 25 октября 2013

Я полагаю, что ОП запрашивает исключительную дизъюнкцию между двумя списками?

( Примечание: Ни одно из предыдущих решений не обрабатывает дубликаты!)

Если вы хотите написать код самостоятельно в Groovy, выполните следующие действия:

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

Один гоч, использует списки / массивы целых. У вас могут возникнуть проблемы из-за полиморфного метода remove (int) vs remove (Object). См. Здесь (непроверенное) решение .

Вместо того, чтобы заново изобретать колесо, однако , вы должны просто использовать существующую библиотеку (например, 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']
0 голосов
/ 18 декабря 2018

Если это список чисел, вы можете сделать это:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...