如何从scala Map转换为scala.集合.不可变.哈希Map?

ezykj2lf  于 2022-11-29  发布在  Scala
关注(0)|答案(3)|浏览(196)

出于某种奇怪的原因,有一个方法merged只在scala.collection.immutable.HashMap中声明,而不在泛型Map trait中声明(也许它的实现使它对其他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集合泛型特性的默认实现?

ia2d9nvy

ia2d9nvy1#

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

immutable.HashMap.empty ++= yourMap
whitzsjs

whitzsjs2#

这不会回答您的问题,但它是您问题的解决方案。它会更快地执行以下操作:
1.实现map所需的merged方法,
1.使用map上定义的++方法进行合并。

ymzxtsji

ymzxtsji3#

假设原始Map已经是immutable.HashMap,最有效的转换方法是immutable.HashMap.from(originalMap),因为它返回的是已经是immutable.HashMap的原始Map。
但是考虑到immutable.Map构造函数仅在大小大于4时才生成immutable.HashMap

scala> val generic4 = Map("a" -> 1, "b" -> 2, "c" -> 3,  "d" -> 4)
val generic4: Map[String, Int] = Map(a -> 1, b -> 2, c -> 3, d -> 4)

scala> generic4.getClass
val res5: Class[? <: Map[String, Int]] = class scala.collection.immutable.Map$Map4

scala> val generic5 = Map("a" -> 1, "b" -> 2, "c" -> 3,  "d" -> 4, "e" -> 5)
val generic5: Map[String, Int] = HashMap(e -> 5, a -> 1, b -> 2, c -> 3, d -> 4)

scala> generic5.getClass
val res6: Class[? <: Map[String, Int]] = class scala.collection.immutable.HashMap

scala> val specific5 = HashMap.from(generic5)
val specific5: scala.collection.immutable.HashMap[String, Int] = HashMap(e -> 5, a -> 1, b -> 2, c -> 3, d -> 4)

scala> specific5 eq generic5
val res7: Boolean = true

相关问题