2016-03-30 10 views
-2

Ich möchte Duplikate konditionieren Karten zu bestimmten Bedingungen gleich entfernen, habe ich die Karten unter:Duplikate entfernen Karten gleich Groovy/Grails

def map = [[name: "111F", invoice:"40",bilD:"aaaa", title:null],[name: "111F", invoice:"40",bilD:"aaaa",title:"something"],[name: "111F", invoice:"40",bilD:"bbbb",title:"something"]] 

ich unten mit dem Code versucht, das zu tun, aber es ist nicht Arbeits

def newMap = map.unique {a, b -> (a.name == b.name && a.invoice == b.invoice && a.bilD == b.bilD)} 

Wie kann ich eine Karte wie erhalten unter

[ 
     [name: "111F", invoice:"40",bilD:"aaaa",title:"somethingOrNull"],[name: "111F", invoice:"40",bilD:"bbbb",title:"something"] 
     ] 

Antwort

0

Collection.unique(Closure) verhält sich unterschiedlich, je nach der Anzahl der Parameter in der Schließung. Wenn der Verschluss einen Parameter hat es erwartet ...

... Wert zum Vergleich verwendet (entweder mit Vergleichbarem # compareTo (java.lang.Object) oder Objekt # equals (java.lang.Object)).

Wenn jedoch die Schließung zwei Argumente enthält, wie in Ihrem Beispiel gezeigt, muss der Verschluss eine ganze Zahl zurückgeben ...

...with 0 indicating the items are not unique 

Seltsamerweise das zweiargumentigen Schließung Verhalten zu sein scheint in genaues Gegenteil von dem, wie es beschrieben wird. Hier ist ein funktionierendes Beispiel:

def maps = [ 
    [name: "111F", invoice:"40",bilD:"aaaa"], 
    [name: "111F", invoice:"40",bilD:"aaaa"], 
    [name: "111F", invoice:"40",bilD:"bbbb"] 
] 

assert maps.unique(false) {a, b -> 
    a.name == b.name && a.invoice == b.invoice && a.bilD == b.bilD ? 0 : 1 
} == [['name':'111F', 'invoice':'40', 'bilD':'aaaa'], ['name':'111F', 'invoice':'40', 'bilD':'bbbb']] 

aber in Ihrem Fall, können Sie einfach einzigartig() verwenden, ohne die Schließung:

assert maps.unique(false) == [['name':'111F', 'invoice':'40', 'bilD':'aaaa'], ['name':'111F', 'invoice':'40', 'bilD':'bbbb']] 
+0

@ Rosa, es funktioniert !! Vielen Dank!! – sade

1

Der einfachste Weg, kann ich t hink of is, füge alle Elemente zu einer Menge hinzu und transformiere die resultierende Menge zurück in die Liste (beachte, dass deine Variable map tatsächlich eine Liste enthält).

Der kürzeste Weg ich denken kann anrufen würde:

def newMap = (map as Set) as List 
+0

Ihr Code funktioniert in der Tat mit meinem ersten Karte Beispiel, aber ich habe einen Fehler gemacht Entschuldigung dafür, es gibt andere Elemente in meiner Map namens (title), irgendwann gefüllt und manchmal leer, ich habe meine Frage bearbeitet, wenn ich deinen Code ausprobiere, gibt es 3 Maps anstelle von 2. jede Idee, wie das zu beheben? – sade