Scala:将Map [K,V]转换为IntMap [V]的最有效方法是什么?

时间:2011-03-06 08:55:20

标签: scala map

让我们说我有一个带有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
}

[编辑]我的意思是更快,但我也会对较短的版本感兴趣,即使它们显然不是很快。

2 个答案:

答案 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)可能会导致更好的性能。