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中。
这可能吗?也许结合使用foldLeft
和for
- 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
结果处理,所以Vector
或List
是没有区别的。
谢谢,我喜欢它! “case”关键字有特殊意义还是仅仅是品味问题?因为'orders.tail.scanLeft(handleOrders(prev,orders)){(p,o)=> handleOrder(p,o)}'甚至'orders.tail.scanLeft(handleOrders(prev,orders)){handleOrder _,_)}'也能完成这项工作。 – binuWADa
你是对的。没有必要使用'case'。我想我已经把它写出来了(这是比较复杂的比赛所必需的)。 ('case'可能会慢一些。) – Debilski
虽然我使用'(p,o)=>'版来更清楚哪个是哪个。最后,这确实是一个品味问题。 – Debilski