2016-03-30 9 views
-2

Ben çiftleri elemek istiyoruz Groovy/Grails şart eşit eşler bazı koşullar eşit eşler, ben haritalar aşağıda var: bunu ben aşağıda koduyla çalıştıçiftleri çıkarın

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"]] 

, ama onun değil çalışma

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

nasıl Yapamıyorum

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

cevap

0

Collection.unique(Closure) farklı kapatılması parametrelerin sayısına bağlı olarak farklı şekilde davranır. kapatma beklediğinin bir parametre ...

... karşılaştırma için kullanılan bir değere sahiptir aktarırken ( Karşılaştırılabilir # compareTo (java.lang.Object) ya da Object # eşittir (java.lang.Object kullanarak)). kapatma iki argüman içeriyorsa

Ancak, sizin örnekte görüldüğü gibi, daha sonra kapatma

...with 0 indicating the items are not unique 

Garip iki argüman kapatma davranışı gibi görünüyor ... bir tamsayı geri dönmelidir Nasıl tarif edildiğinin tam tersi.

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']] 

Ancak, sizin durumunuzda, sadece kapatma olmadan() benzersiz kullanabilirsiniz: Burada çalışan bir örnektir

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

@ Rosa, işe yarıyor! Teşekkürler!! – sade

1

kolay yolu aşağıdaki gibi bir haritasını alabilirsiniz hink, tüm öğeleri bir kümeye ekler, sonra sonuç kümesini tekrar listeye dönüştürür (not, map değişkeninizin aslında bir liste içerdiğini unutmayın). Ben arar ki aklınıza gelebilecek

en kısa yol:

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

Kodunuz benim ilk harita örnekle gerçekten çalışır, ancak bir hata yaptım bunun için özür dilerim, benim haritamda (başlık) başka bir öğe var, bazen dolu ve bazen boş, sorumu düzenledim, kodunuzu denediğimde 2 yerine 3 harita döndürdüm. herhangi bir fikri nasıl düzeltebilirim? – sade