2015-12-21 37 views
4

我有一個集合作爲這樣:您如何在Groovy中使用GroupBy和Sum?

[[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]) } 

謝謝!

回答

5

在GROUPBY方法關閉標識要通過列表條目下得分組,按值歸檔組什麼:

x.groupBy { it[0] } // map entries by patient number 

評估爲

[1:[[1, 20.28], [1, 11.11]], 2:[[2, 4.60], [2, 3.68]]] 

的collectEntries方法規定假設collectEntries的每個輸入都具有某個鍵的患者編號以及某個值的該鍵的對列表,則每個映射條目的外觀如何。所以

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

評估爲

[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() 
+0

我現在如何獲得平均值的平均值?我試過avgs.sum {it [1]}/avgs.size(),但它導致沒有方法的簽名:java.util.LinkedHashMap.sum()。 –

+1

@ZacSol:map沒有sum方法,它只對列表和集合有意義,所以使用map.entrySet()。補充說這個答案。 –