2011-11-22 88 views
1

我必须(为了简化这里Int)订单的顺序处理:从所谓是否有foldLeft和for-yield的组合?

def nextGroup(prev: Double, orders: Seq[Int]): Seq[Double] 

功能

// the handleOrder methods are in fact much more complicated: 
def handleOrders(prev: Double, orders: Seq[Int]): Double = prev + orders.sum 
def handleOrder(prev: Double, order: Int): Double = prev/order 

结果我得到另一个类(这里Double为了简化序列)。

从这我实施了两个版本。

版本1(foldLeft和明确的建设者):

def nextGroup1(prev: Double, orders: Seq[Int]): Seq[Double] = { 
    import collection.mutable.Builder 
    import collection.immutable.VectorBuilder 
    val bld: Builder[Double, Seq[Double]] = new VectorBuilder[Double] 
    var first = true 
    orders.foldLeft(prev) { (prev, order) => 
    val step = if (first) handleOrders(prev, orders) else prev 
    val next = handleOrder(step, order) 
    first = false 
    bld += next 
    next 
    } 
    bld.result 
} 

版本2(VAR和产量建设者):

def nextGroup2(prev: Double, orders: Seq[Int]): Seq[Double] = { 
    var first = true 
    var präv = prev 
    for (order <- orders) yield { 
    if (first) präv = handleOrders(präv, orders) 
    präv = handleOrder(präv, order) 
    first = false 
    präv 
    } 
} 

我想救不明确的建设者在版本1中可变var在版本2中。

这可能吗?也许结合使用foldLeftfor - yield

而且还是一些样本数据:作为Seq[Double]

val orders = Seq(1, 2, 3) 
nextGroup1(1d, orders) // => Vector(7.0, 3.5, 1.1666666666666667) 
nextGroup2(1d, orders) // => List(7.0, 3.5, 1.1666666666666667) 
nextGroup1(2d, orders) // => Vector(8.0, 4.0, 1.3333333333333333) 
nextGroup2(2d, orders) // => List(8.0, 4.0, 1.3333333333333333) 

nextGroup结果处理,所以VectorList是没有区别的。

回答

6
orders.tail.scanLeft(handleOrders(prev, orders)) { (p, o) => handleOrder(p, o) } 

scanLeft不一样foldLeft做,但保留所有的中间结果。您可以通过排除head的收藏夹来摆脱特殊情况,您可以使用orders.tail进行收藏。

+0

谢谢,我喜欢它! “case”关键字有特殊意义还是仅仅是品味问题?因为'orders.tail.scanLeft(handleOrders(prev,orders)){(p,o)=> handleOrder(p,o)}'甚至'orders.tail.scanLeft(handleOrders(prev,orders)){handleOrder _,_)}'也能完成这项工作。 – binuWADa

+0

你是对的。没有必要使用'case'。我想我已经把它写出来了(这是比较复杂的比赛所必需的)。 ('case'可能会慢一些。) – Debilski

+0

虽然我使用'(p,o)=>'版来更清楚哪个是哪个。最后,这确实是一个品味问题。 – Debilski

相关问题