0

Map(FULL -> 3854.0, REMAINING -> 3769.0) (FULL/REMAINING)*100 のような 2 つの値を計算したい次のマップがあります。これを行う良い方法はありますか? 試してみm.foldLeft(0)(_/_._2)ましたが、float と Int の型の不一致についてコンパイラが不平を言っていますか?

4

2 に答える 2

4

0.0の最初の引数として指定することで型の不一致を修正できますが、それではfoldLeftコードが正しくなりません。0.0/3854.0/3769.0次に、に等しいものを計算し0.0ます。

実際、Map(FULL -> 3854.0, REMAINING -> 3769.0)注文が保証されているわけではないので、あなたができる最善のことはだと確信していますm('FULL') / m('REMAINING')

おそらくcase class、代わりにこれを作成する必要があります。その場合は、それm.full/m.remainingを自動的に計算するメソッドを作成することもできます。

于 2012-08-20T23:21:12.227 に答える
1

Map では、2 つの値が実際に存在するという保証はありません。したがって、Ken Bloom がすでに提案したように、そのためのクラスを作成するか、次のgetメソッドを使用してそれを行うことがMapできますOption[B]

val resOpt = for {
  full <- m.get("FULL")
  remainig <- m.get("REMAINING")
} yield (full / remaining) * 100

resOpt.getOrElse(someDefaultValue)

これにより、厄介な実行時エラーを回避できます。

于 2012-08-21T13:04:27.217 に答える