2014-12-04 80 views
0

我有一个名为item的元组列表,列表中的每个索引都包含2 x Double s,斯卡拉foldLeft太多参数

item = ((1.0, 2.0), (3.0, 4.0), (10.0, 100.0)) 

我要将列表item内执行每个指标的计算,我想用foldLeft做到这一点。这是我的代码:

item.foldLeft(0.0)(_ + myMethod(_._2, _._1, item.size))) 

_._2访问当前item元组在索引1和_._1索引为0例如访问当前item元组第一个把它折叠应该有效地:

item.foldLeft(0.0)(_ + myMethod(2.0, 1.0, item.size))) 

第二折:

item.foldLeft(0.0)(_ + myMethod(4.0, 3.0, item.size))) 

第三折:

item.foldLeft(0.0)(_ + myMethod(100.0, 10.0, item.size))) 

其中myMethod的:

def myMethod(i: Double, j:Double, size: Integer) : Double = { 
    (j - i)/size 
    } 

这是给我一个错误,说这个因为它需要2个参数,所以foldLeft的参数太多。 myMethod返回Double,并且_Double。那么,编译器看到的这个额外参数在哪里?

如果我这样做:

item.foldLeft(0.0)(_ + _._1)) 

它在item每个索引总结了所有的第一Double秒 - 在item每个索引与_._ 2总结了所有的第二Double小号替换_._ 1 。

任何帮助,非常感谢!

回答

3

每个_相当于一个新的参数,所以(_ + myMethod(_._2, _._1, item.size))是一个具有3个参数的匿名函数:(x, y, z) => x + myMethod(y._2, z._1, item.size)

你想要的是(acc, x) => acc + myMethod(x._2, x._1, item.size)

+0

**谢谢**!我应该在4小时前问过。从Java背景来看,我正在艰难地抓住'_'。再次感谢你! – monster 2014-12-04 20:10:30

+0

我很高兴它帮助:) – Dimitri 2014-12-04 20:12:25