2

マップ内に結果を蓄積する必要があります。、、、を使ってこれを試してみましたが.map、正しく使用していないことに気づきました。正しい答えを得るには、通話に最新の地図が必要です。.reduceLeft.foldLeft(init(m))expression

私はこれでうまくいきましたがvar、ループで更新されるマップを持っていることには少し汚い感じがします。これはScalaのベストプラクティスの観点から受け入れられますか?より慣用的に書き直す良い方法はありますか?

val acc = "some key name"
val id = "some other key name"
val myColl = List(1, 2, 3, 4, 5)

// oversimplification (these things actually do work and access other keys in the map)
def expression(m:Map[String, Int]) = (m(acc)) + (m(id))
def init(m:Map[String, Any]) = 0

// can this be made better?
def compute(m: Map[String, Int]) = {
  var initMap = m + (acc -> init(m))
  for(k <- myColl) {
    initMap = initMap + (id -> k)
    val exp = expression(initMap)
    initMap = initMap + (acc -> exp)
  }
  initMap(acc)
}

compute(Map())
4

1 に答える 1

2

これがよりクリーンかどうかはわかりませんが、変数の使用を回避できます。

def compute(m:Map[String, Int]) = {
  val initMap = myColl.foldLeft(m + (acc -> init(m)))( (e, k) => 
    e + (id -> k) + (acc -> expression(e + (id -> k))))
  initMap(acc)
}

同じ結果を返す必要があります

于 2012-09-27T22:43:53.663 に答える