0

我有下面的地图Map(FULL -> 3854.0, REMAINING -> 3769.0) 我想计算两个值,使得 (FULL/REMAINING)*100 有一个好方法吗?我试过m.foldLeft(0)(_/_._2)了,但编译器抱怨 float 和 Int 之间的类型不匹配?

4

2 回答 2

4

您可以通过指定0.0为 的第一个参数来修复类型不匹配foldLeft,但这不会使您的代码正确。然后它将计算0.0/3854.0/3769.0which equals 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,不能保证这两个值确实存在。因此,您可能想要为此创建一个类,正如 Ken Bloom 已经建议的那样,或者使用getof 方法来实现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 回答