in den Kommentaren, wie gesagt optimiert ist, sind die Paare in l1
einzigartig (oder besser gesagt: es ist in Ordnung einzigartige Ergebnisse haben), dann c Sie eine Verwendung l1/l2 als Sätze:
l1 = [[x:1, y:1]]
l2 = [[x:0, y:0]]
println l1.toSet()-l2.toSet()
//; [[x:1, y:1]]
Das Problem ursprünglich ist die [x:0,y:0]
vs [x:1,y:1]
Teil. Der Grund ist in public static <T> Collection<T> minus(Collection<T> self, Collection<?> removeMe)
. Die n * n branchs wird gewählt und das NumberAwareComperator
denkt beide Karten sind gleich:
def cmp = new org.codehaus.groovy.runtime.NumberAwareComparator()
println cmp.compare(l1[0], l2[0])
//; 0 (equal!)
die einfach läuft darauf hinaus:
assert [x:1, y:1].hashCode() == [x:0, y:0].hashCode()
// 120^1 + 121^1 == 120^0 + 121^0
bearbeiten Alternative (wenn Sie loswerden der Karte bekommen kann)
Da dies für eine Basis nicht so gut aussieht, ist es vielleicht besser, eine sichere und klanglich vergleichbare Klasse für Ihre Daten zu verwenden. z.B .:
@groovy.transform.Immutable
class Pair {
long x,y
}
def p00 = new Pair(0,0)
def p11 = new Pair(1,1)
def p11o = new Pair(1,1)
assert [p00]-[p11] == [p00]
assert [p11]-[p00] == [p11]
assert [p00].intersect([p11]) == []
assert [p11].intersect([p00]) == []
assert [p11].intersect([p11o]) == [p11]
assert [p11].intersect([p11o]) == [p11o]
Auch die Karten in Expando
s Drehen besser funktioniert.
Was meinst du mit Unterschied? Sie wollen, dass jedes x, y von l2 von demselben Index in l1 subtrahiert wird? Und du "arbeitest für mich" Beispiel dort mach die Dinge nur noch verwirrender, weil ich bezweifle, was du willst (halt einfach l1) – cfrick
@cfrick Der Unterschied wie in Mathematik: wir subtrahieren l2 set von l1 set. Das Ergebnis ist = alles in l1, aber nicht in l2. Behandle (x, y) als ein Element, dh (x, y) in l1, aber nicht in l2. Hier ist ein gutes Beispiel: http://mrhaki.blogspot.ru/2010/08/groovy-goodness-subtracting-map-entries.html –
ic. das [x: 0, y: 0] -Paar ist etwas seltsam. es funktioniert mit 'minus()', wenn einer von ihnen nicht "falsy" ist – cfrick