在Groovy中如何使用GroupBy和Sum?

在Groovy中如何使用GroupBy和Sum?,groovy,Groovy,我有这样一个收藏: [[patient1,value1], [patient2,value2]] 例如。 x=[[1,20.28]、[1,11.11]、[2,4.60]、[2,3.68]] 我使用countBy获取每位患者的计数,如下所示: def counts = x.countBy{patient, value -> patient} 我试图在没有运气的情况下获得每位患者的金额: def sums = x.groupBy({patient, value -> patient

我有这样一个收藏:

[[patient1,value1], [patient2,value2]]
例如。
x=[[1,20.28]、[1,11.11]、[2,4.60]、[2,3.68]]

我使用
countBy
获取每位患者的计数,如下所示:

def counts = x.countBy{patient, value -> patient}
我试图在没有运气的情况下获得每位患者的金额:

def sums = x.groupBy({patient, value -> patient }).collectEntries{p, v -> p:v.sum()}
有什么我遗漏的吗

注意:这里的总体目标是获得我使用的患者平均值:

def avgs = sums.collect{patient, value -> (value / counts[patient]) }

谢谢

在groupBy方法中,闭包标识您想要分组的对象,列表条目将在grouped by值下归档:

x.groupBy { it[0] } // map entries by first entry in list (patient number)
评估为

[1:[[1, 20.28], [1, 11.11]], 2:[[2, 4.60], [2, 3.68]]]
[1:31.39, 2:8.28]
collectEntries方法指定使每个地图条目看起来像什么,因为collectEntries的每个输入都有一个键的患者编号和一个值的键对列表。所以

x.groupBy {it[0]}.collectEntries {[(it.key): it.value.sum {it[1]}]}
评估为

[1:[[1, 20.28], [1, 11.11]], 2:[[2, 4.60], [2, 3.68]]]
[1:31.39, 2:8.28]
每位患者的平均值为

x.groupBy {it[0]}.collectEntries {[(it.key): it.value.sum {it[1]}/it.value.size()]}
评估到
[1:15.695,2:4.14]

对于平均值的平均值:

def avgs = [1:15.695, 2:4.14]
def averageOfAverages = avgs.entrySet().sum {it.value} / avgs.size()

我现在如何得到平均值的平均值?我尝试了avgs.sum{it[1]}/avgs.size(),但它没有导致方法java.util.LinkedHashMap.sum()的签名。@ZacSol:map没有sum方法,它只适用于列表和集合之类的东西,所以请使用map.entrySet()。将此添加到答案中。