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

发布于 2024-10-20 06:28:21 字数 445 浏览 1 评论 0原文

假设我有一个带有 toInt 方法的 Point 类,并且对于某些类型 V 有一个不可变的 Map[Point,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
}

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

Let"s say I have a class Point with a toInt method, and I have an immutable Map[Point,V], for some type V. What is the most efficient way in Scala to convert it to an IntMap[V]? Here is my current implementation:

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
}

[EDIT] I meant primarily faster, but I would also be interested in shorter versions, even if they are not obviously faster.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

晨曦慕雪 2024-10-27 06:28:21

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))

IntMap has a built-in factory method (apply) for this:

IntMap(points.map(p => (p._1.toInt, p._2)).toSeq: _*)

If speed is an issue, you may use:

points.foldLeft(IntMap.empty[T])((m, p) => m.updated(p._1.toInt, p._2))
雨夜星沙 2024-10-27 06:28:21

一个使用 breakOut 获取 IntMap 的单行代码。它使用 breakOut 调用解析的自定义构建器工厂 CanBuildFrom 映射到新集合:

Map[Int, String](1 -> "").map(kv => kv)(breakOut[Map[Int, String], (Int, String), immutable.IntMap[String]])

就性能而言,很难告诉,但它创建一个新的 IntMap,遍历所有绑定并将它们添加到 IntMap 中。手写迭代器 while 循环(前面有模式匹配以检查源映射是否是 IntMap)可能会带来更好的性能。

A one liner that uses breakOut to obtain an IntMap. It does a map to a new collection, using a custom builder factory CanBuildFrom which the breakOut call resolves:

Map[Int, String](1 -> "").map(kv => kv)(breakOut[Map[Int, String], (Int, String), immutable.IntMap[String]])

In terms of performance, it's hard to tell, but it creates a new IntMap, goes through all the bindings and adds them to the IntMap. A handwritten iterator while loop (preceded with a pattern match to check if the source map is an IntMap) would possibly result in somewhat better performance.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文