2015-08-25 63 views
4

在寫我自己的之前,有沒有人知道Groovy或Java是否有一些與Excel的sumproduct函數類似的預構建的東西?Groovy或Java相當於sumproduct?

爲SUMPRODUCT準語法是一樣的東西

def list1 = [2,3,4] 
def list2 = [5,10,20] 

SUMPRODUCT(list1, list2 ...) = 120 

你會得到120((2 * 5)+(3 * 10)+(4×20)= 120)

回答

6

您可以transpose()collect()sum結果:

def list1 = [2,3,4] 
def list2 = [5,10,20] 

assert [list1, list2] 
    .transpose() 
    .collect { it[0] * it[1] } 
    .sum() == 120 
2

不是真的出的現成的替代SUMPRODUCT,但仍然是一個班輪:

def list1 = [2,3,4] 
def list2 = [5,10,20] 

assert 120 == GroovyCollections.transpose(list1, list2).sum{ it[ 0 ] * it[ 1 ] } 
+0

你不應該叫'GroovyCollections.transpose'直接。這是一個擴展方法添加到集合 –

+0

@tim_yates,不''[list1,list2]'實例化1個額外的列表比較'GroovyCollections.transpose()'? – injecteer

2

這裏有一個版本SUMPRODUCT的是不限於兩個輸入列表:

def sumproduct(List... lists) { 
    (lists as List).transpose().sum { it.inject(1) { prod, val -> prod * val } } 
} 

調用它sumproduct([2,3,4], [5,10,20], [1,2,3])收益310