如何从scala映射转换为scala.collection.immutable.HashMap?
出于某种奇怪的原因,有一种方法如何从scala映射转换为scala.collection.immutable.HashMap?,scala,scala-collections,Scala,Scala Collections,出于某种奇怪的原因,有一种方法merged,它只在scala.collection.immutable.HashMap中声明,而不是在genericMaptrait中声明(也许它的实现使得它对其他Map实现非常不受欢迎?) 因此,我需要将我的Map[A,B]转换为HashMap[A,B],到目前为止,我还没有找到一种简单的方法来实现。这是我目前对[Col[\u]]的定义进行破解的实现,它需要一元更高的种类,而不是二进制更高的种类 val m1 = Map("foo" -> 1) val m
merged
,它只在scala.collection.immutable.HashMap
中声明,而不是在genericMap
trait中声明(也许它的实现使得它对其他Map
实现非常不受欢迎?)
因此,我需要将我的Map[A,B]
转换为HashMap[A,B]
,到目前为止,我还没有找到一种简单的方法来实现。这是我目前对[Col[\u]]的定义进行破解的实现,它需要一元更高的种类,而不是二进制更高的种类
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 collection generic traits的默认实现的更好方法?您可以从一个空HashMap开始,并在其中添加所有元素:
immutable.HashMap.empty ++= yourMap
这不会回答您的问题,但它是您问题的解决方案。 它将更快地实现以下目标:
merged
方法++
方法进行合并也许
哈希映射(m1.toSeq:*)
?有关合并映射的其他选项,请参阅。如果您使用的操作仅在HashMap
中可用,为什么不首先将您的映射声明为HashMap
?@ukasz是的,我看到了这个问题,但我的代码的这一部分对性能非常敏感,使用toSeq
将需要两次迭代。同样地,merged
被认为是非常有效的,所以最好使用它。@RüdigerKlaehn因为我通过调用数组上的toMap
来获得这些映射。我可以手动将其折叠为HashMap
,但如果可能的话,不可以。因此,如果您想加快速度,可能需要使用数组并执行HashMap。空[String,Int]++array
。要内联执行此操作,您需要帮助类型推断不再获得普通的映射<代码>((HashMap.empty++array):HashMap[String,Int])合并…
OP-want不可变。HashMap
@ukasz:修复,也没有太大区别,应该只是++
,而不是++=
。