仅从数组中获取唯一值

时间:2019-04-12 17:53:54

标签: groovy

我有一个数组数组,我只需要从该数组中获取唯一值empnamedept,而不必依赖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]]

3 个答案:

答案 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仅基于empnamedept键来计算不同值的集合。由您决定放弃hoursWorked键。