一連の注文を処理する必要があります (ここInt
では簡略化のために):
// 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
いわゆる
def nextGroup(prev: Double, orders: Seq[Int]): Seq[Double]
function 別のクラスのシーケンスを取得します (ここDouble
では簡略化のために)。
これから、2つのバージョンを実装しました。
バージョン 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 および yield builder 用):
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
}
}
var
バージョン 1 で明示的なビルダーを保存するか、バージョン 2 でミュータブルを保存したいと思います。
これは可能ですか?foldLeft
おそらく、とfor
-の組み合わせでyield
?
そしてまだ何かサンプルデータ:
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
として扱われる結果は、Seq[Double]
そうでVector
あろList
うとなかろうと違いはありません。