让我们说我有一个带有toInt
方法的类Point,对于某些类型Map[Point,V]
,我有一个不可变的V
。在Scala中,最有效的方法是什么?将其转换为IntMap[V]
?这是我目前的实现:
def pointMap2IntMap[T](points: Map[Point,T]): IntMap[T] = {
var result: IntMap[T] = IntMap.empty[T]
for(t <- points) {
result += (t._1.toInt, t._2)
}
result
}
[编辑]我的意思是更快,但我也会对较短的版本感兴趣,即使它们显然不是很快。
答案 0 :(得分:4)
IntMap
有一个内置的工厂方法(apply
):
IntMap(points.map(p => (p._1.toInt, p._2)).toSeq: _*)
如果速度有问题,您可以使用:
points.foldLeft(IntMap.empty[T])((m, p) => m.updated(p._1.toInt, p._2))
答案 1 :(得分:1)
使用breakOut
获取IntMap
的单行班次。它使用map
调用解析的自定义构建器工厂CanBuildFrom
对新集合执行breakOut
:
Map[Int, String](1 -> "").map(kv => kv)(breakOut[Map[Int, String], (Int, String), immutable.IntMap[String]])
就性能而言,很难说,但它会创建一个新的IntMap
,遍历所有绑定并将它们添加到IntMap
。手写迭代器while
循环(前面有模式匹配以检查源映射是否为IntMap
)可能会导致更好的性能。