删除与Groovy/Grails条件相同的重复映射
我想删除与某些条件相同的重复贴图,我有以下贴图:删除与Groovy/Grails条件相同的重复映射,groovy,Groovy,我想删除与某些条件相同的重复贴图,我有以下贴图: 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 =
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"]
]
我能想到的最简单的方法是,将所有元素添加到一个集合中,然后将生成的集合转换回列表(注意,您的变量
map
实际上包含一个列表)
我能想到的最短的方法是打电话:
def newMap = (map as Set) as List
Collection.unique(闭包)
根据闭包中的参数数量,其行为会有所不同。当闭包有一个它期望的参数时
…用于比较的值(使用
Comparable#compareTo(java.lang.Object)或
Object#equals(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']]
但是,在您的情况下,您可以简单地使用unique()而不使用闭包:
assert maps.unique(false) == [['name':'111F', 'invoice':'40', 'bilD':'aaaa'], ['name':'111F', 'invoice':'40', 'bilD':'bbbb']]
您的代码确实适用于我的第一个地图示例,但我犯了一个错误,很抱歉,我的地图中还有一个名为(title)的元素,有时是填充的,有时是空的,我编辑了我的问题,当我尝试您的代码时,它返回3个地图,而不是2个。你知道怎么解决这个问题吗?