Groovy:通过多个值从地图列表中删除重复项

Tes*_*est 2 collections maps groovy unique

有一个这样的地图列表

def listOfMaps = 
[
    ["car": "A", "color": "A", "motor": "A", "anything": "meh"],
    ["car": "A", "color": "A", "motor": "A", "anything": "doesn't matter"],
    ["car": "A", "color": "A", "motor": "B", "anything": "Anything"],
    ["car": "A", "color": "B", "motor": "A", "anything": "Anything"]
]
Run Code Online (Sandbox Code Playgroud)

我该如何按汽车、颜色和发动机查找重复项?如果有超过 1 个地图具有相同的汽车、颜色和发动机值,则应返回 true。在这种情况下,它应该返回 true,因为第一张地图和第二张地图具有相同的汽车、颜色和发动机值,只要它们相同,值可以是任何值。

Szy*_*iak 6

Groovy 有一个方便的Collection.unique(boolean,closure)方法,允许您根据闭包中定义的比较器从输入列表中删除重复项来创建新列表。在您的情况下,您可以定义一个闭包,首先比较carfield,然后比较color,最后比较 - motor。任何与所有这些字段重复值的元素都将被过滤掉。

考虑以下示例:

def listOfMaps = [
    ["car": "A", "color": "A", "motor": "A", "anything": "meh"],
    ["car": "A", "color": "A", "motor": "A", "anything": "doesn't matter"],
    ["car": "A", "color": "A", "motor": "B", "anything": "Anything"],
    ["car": "A", "color": "B", "motor": "A", "anything": "Anything"]
]

// false parameter below means that the input list is not modified
def filtered = listOfMaps.unique(false) { a, b ->
    a.car <=> b.car ?:
        a.color <=> b.color ?:
        a.motor <=> b.motor
}

println filtered

boolean hasDuplicates = listOfMaps.size() > filtered.size()

assert hasDuplicates
Run Code Online (Sandbox Code Playgroud)

输出:

[[car:A, color:A, motor:A, anything:meh], [car:A, color:A, motor:B, anything:Anything], [car:A, color:B, motor:A, anything:Anything]]
Run Code Online (Sandbox Code Playgroud)