【问题标题】:How to convert from scala Map to scala.collection.immutable.HashMap?如何从 scala Map 转换为 scala.collection.immutable.HashMap?
【发布时间】:2016-08-27 03:22:56
【问题描述】:

出于某种奇怪的原因,有一个方法 merged 仅在 scala.collection.immutable.HashMap 中声明,但不在通用 Map 特征中声明(也许它的实现使其对其他 Map 实现非常不受欢迎?)。

所以我需要将我的Map[A, B] 转换为HashMap[A, B],到目前为止我还没有找到一个简单的方法来做到这一点。这是我目前在def to[Col[_]] 周围hack 的实现,它期望一元更高种类而不是二进制更高种类。

val m1 = Map("foo" -> 1)
val m2 = Map("foo" -> 2, "bar" -> 2)

type HM[_] = HashMap[String, Int]
(m1.to[HM] merged m2.to[HM]) { case ((k1, v1), (k2, v2)) => (k1, v1 + v2) } // Map("foo" -> 3, "bar" -> 2)

它按预期工作,但我不禁想到必须有更好的方法将 Map 转换为 HashMap(假设它是默认实现)。

或者更一般地说,访问 scala 集合通用特征的默认实现的更好方法?

【问题讨论】:

  • 可能是HashMap(m1.toSeq: _*)?有关合并地图的其他选项,请参阅 stackoverflow.com/questions/7076128/…
  • 如果您使用仅在HashMap 中可用的操作,为什么不首先将您的地图声明为HashMap
  • @Łukasz 是的,我已经看到了这个问题,但是我的这部分代码对性能非常敏感,使用 toSeq 将需要 2 次迭代。同样,merged 据说效率很高,所以使用它会很好。
  • @RüdigerKlaehn 因为我通过在数组上调用toMap 来获取这些地图。我可以手动将其折叠到HashMap,但如果可能的话不要折叠。
  • 因此,如果您想更快,您可能想要使用您的阵列并执行HashMap.empty[String, Int] ++ array。要内联执行此操作,您需要帮助进行类型推断,以免再次获得普通的 Map((HashMap.empty ++ array): HashMap[String, Int]) merged ...

标签: scala scala-collections


【解决方案1】:

您可以从一个空的 HashMap 开始,然后在其中添加所有元素:

immutable.HashMap.empty ++= yourMap

【讨论】:

  • OP 通缉immutable.HashMap
  • @Łukasz:已修复,也没有太大区别
  • 应该只是++,而不是++=
【解决方案2】:

这不会回答您的问题,但它可以解决您的问题。 这样做会更快:

  1. 实现地图所需的merged方法,
  2. 使用地图上定义的++ 方法进行合并。

【讨论】:

    猜你喜欢
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多