如何在Scala中将immutable.Map转换为mutable.Map?

时间:2011-02-18 15:04:13

标签: scala map scala-2.8

如何在Scala中将immutable.Map转换为mutable.Map,以便更新Map中的值?

6 个答案:

答案 0 :(得分:113)

最干净的方法是使用mutable.Map varargs工厂。与++方法不同,它使用CanBuildFrom机制,因此如果编写库代码以利用此功能,则可能更有效:

val m = collection.immutable.Map(1->"one",2->"Two")
val n = collection.mutable.Map(m.toSeq: _*) 

这是有效的,因为Map也可以被视为一系列对。

答案 1 :(得分:37)

val myImmutableMap = collection.immutable.Map(1->"one",2->"two")
val myMutableMap = collection.mutable.Map() ++ myImmutableMap

答案 2 :(得分:4)

如何使用collection.breakOut?

import collection.{mutable, immutable, breakOut}
val myImmutableMap = immutable.Map(1->"one",2->"two")
val myMutableMap: mutable.Map[Int, String] = myImmutableMap.map(identity)(breakOut)

答案 3 :(得分:0)

有一个变体可以创建一个空的mutable Map,其默认值取自不可变Map。您可以随时存储值并覆盖默认值:

scala> import collection.immutable.{Map => IMap}
//import collection.immutable.{Map=>IMap}

scala> import collection.mutable.HashMap
//import collection.mutable.HashMap

scala> val iMap = IMap(1 -> "one", 2 -> "two")
//iMap: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,one), (2,two))

scala> val mMap = new HashMap[Int,String] {      
     | override def default(key: Int): String = iMap(key)
     | }
//mMap: scala.collection.mutable.HashMap[Int,String] = Map()

scala> mMap(1)
//res0: String = one

scala> mMap(2)
//res1: String = two

scala> mMap(3)
//java.util.NoSuchElementException: key not found: 3
//  at scala.collection.MapLike$class.default(MapLike.scala:223)
//  at scala.collection.immutable.Map$Map2.default(Map.scala:110)
//  at scala.collection.MapLike$class.apply(MapLike.scala:134)
//  at scala.collection.immutable.Map$Map2.apply(Map.scala:110)
//  at $anon$1.default(<console>:9)
//  at $anon$1.default(<console>:8)
//  at scala.collection.MapLike$class.apply(MapLike.scala:134)....

scala> mMap(2) = "three"

scala> mMap(2)          
//res4: String = three

警告(请参阅Rex Kerr的评论):您将无法删除来自不可变地图的元素:

scala> mMap.remove(1)
//res5: Option[String] = None

scala> mMap(1)
//res6: String = one

答案 4 :(得分:0)

通过.to(factory)所应用的工厂建造者来开始Scala 2.13

Map(1 -> "a", 2 -> "b").to(collection.mutable.Map)
// collection.mutable.Map[Int,String] = HashMap(1 -> "a", 2 -> "b")

答案 5 :(得分:0)

在scala 2.13中,有两种选择:源地图实例的malloc()方法或目标地图的伴随对象的to方法。

from

如您所见,scala> import scala.collection.mutable import scala.collection.mutable scala> val immutable = Map(1 -> 'a', 2 -> 'b'); val immutable: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b) scala> val mutableMap1 = mutable.Map.from(immutable) val mutableMap1: scala.collection.mutable.Map[Int,Char] = HashMap(1 -> a, 2 -> b) scala> val mutableMap2 = immutable.to(mutable.Map) val mutableMap2: scala.collection.mutable.Map[Int,Char] = HashMap(1 -> a, 2 -> b) 实现由库决定。 如果要选择特定的实现,例如mutable.Map,请用mutable.HashMap替换所有出现的mutable.Map