2016-03-30 55 views
-2

我想刪除重複映射等於某些情況下,我有以下地圖:刪除重複映射等於調節的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"]] 

我用下面的代碼試圖做到這一點,但它不是工作

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

我怎樣才能得到一個地圖像下面

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

回答

0

Collection.unique(Closure)行爲有所取決於在封閉參數的數量。當封閉件具有它需要一個參數...

...用於比較的值(使用 可比#的compareTo(java.lang.Object中)或 對象#等於(java.lang.Object中))。

但是,如果關閉包含兩個參數,如在你的例子所示,然後關閉必須返回一個整數...

...with 0 indicating the items are not unique 

奇怪的是,兩個參數的封閉行爲似乎是在與其描述的方式完全相反。這裏有一個工作示例:

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

然而,在你的情況,你可以簡單地使用唯一的()沒有關閉:

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

@Rosa,它的工作原理!謝謝!! – sade

1

最簡單的方法我可以T將所有元素添加到一個集合中,然後將結果集合轉換回列表(請注意,變量map實際上包含一個列表)。

我能想到會被調用的最短路徑:

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

你的代碼的工作確實是我的第一張地圖的例子,但我犯了一個錯誤對不起,我的地圖中有其他元素名稱爲(標題),有時填充並且有時爲空,我編輯了我的問題,當我嘗試你的代碼時,它返回3張地圖而不是2張。任何想法如何解決這個問題? – sade