2016-03-30 10 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)} 

は、どのように私は私がTでき

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

答えて

0

Collection.unique(Closure)振る舞います。クロージャは、それが予期つのパラメータ...

...比較のために使用される値を有する場合(いずれか 同等#1のcompareTo(java.lang.Object上位)または オブジェクト#の等号(java.lang.Object上位を使用して))。

しかし、クロージャは二つの引数が含まれている場合、あなたの例に示すように、その後、閉鎖は整数を返さなければならない...

...with 0 indicating the items are not unique 

不思議なことに、2つの引数の閉鎖動作は、中のようですそれが記述されている方法とは正反対です。ここでは作業例です:

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

最も簡単な方法は下のようなマップを得ることができますすべての要素をセットに追加し、結果セットをリストに変換して戻します(変数mapには実際にリストが含まれています)。

私は呼び出すことになると考えることができ、最短の方法:異なっクロージャ内のパラメータの数に応じて、

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

あなたのコードは私の最初のマップの一例で実際に動作しますが、私はミスを犯しました私の質問を編集しました。あなたのコードを試してみましたが、これは2つではなく3つのマップを返します。これを修正する方法はありますか?ありがとうございました。 – sade