我有一个数组数组,我只需要从该数组中获取唯一值empname
和dept
,而不必依赖hoursWorked
。
def data = [[empname:'Test1',dept:10,hoursWorked:6],
[empname:'Test1',dept:10,hoursWorked:2],
[empname:'Test2',dept:10,hoursWorked:10]] as Set
println data;
我使用Set,以便它仅包含唯一值。由于hoursWorked
不同,因此我得到了所有三个值。
我希望预期的结果是:
[[empname:Test1, dept:10],[empname:Test2, dept:10]]
答案 0 :(得分:3)
您可以将地图列表转换为一组地图,但是首先,您需要将列表转换为仅包含您感兴趣的地图条目。请考虑以下示例:
Echo Is Not Running) || Echo Is Running)
在第一次运行中,它将每个映射转换为仅包含两个键的映射,然后,将列表转换为一组,因此仅包含data.collect { [empname: it.empname, dept: it.dept] }.toSet()
和{{1 }}。
它产生预期的输出:
empname
答案 1 :(得分:2)
是的,因为值不一样,所以不起作用。
您可以为数据编写比较闭包并将其传递给unique
请注意,因为unique
会改变原始列表
def data = [
[empname:'Test1',dept:10,hoursWorked:6],
[empname:'Test1',dept:10,hoursWorked:2],
[empname:'Test2',dept:10,hoursWorked:10]
]
println data.unique { a, b -> a.empname <=> b.empname ?: a.dept <=> b.dept }
// Prints: [[empname:Test1, dept:10, hoursWorked:6], [empname:Test2, dept:10, hoursWorked:10]]
println data
// Prints: [[empname:Test1, dept:10, hoursWorked:6], [empname:Test2, dept:10, hoursWorked:10]]
// Original collection was mutated
答案 2 :(得分:1)
您可以将unique与闭包一起使用,返回仅基于您要使用的键的值:
data.unique{[it['empname'], it['dept']]}
===> [[empname:Test1, dept:10, hoursWorked:6],
[empname:Test2, dept:10, hoursWorked:10]]
data.unique{[it['empname'], it['dept']]}
将使Groovy仅基于empname
和dept
键来计算不同值的集合。由您决定放弃hoursWorked
键。