回答:
最もクリーンな方法は、mutable.Map
varargsファクトリーを使用することです。++
アプローチとは異なり、これはCanBuildFrom
メカニズムを使用するため、ライブラリコードがこれを利用するように記述されている場合、より効率的になる可能性があります。
val m = collection.immutable.Map(1->"one",2->"Two")
val n = collection.mutable.Map(m.toSeq: _*)
これMap
は、ペアを一連のペアとして表示することもできるため機能します。
: _*
型の割り当てによく似ており、与えられた式にどの型を割り当てるかをコンパイラに正確に伝えます。ここでそれを「このシーケンスを取り、それをいくつかの可変引数パラメーターとして扱う」と考えることができます。
val myImmutableMap = collection.immutable.Map(1->"one",2->"two")
val myMutableMap = collection.mutable.Map() ++ myImmutableMap
O(1)
段階的に永続的なコレクションに戻すことができることを知っています。これはのように見えますがO(n)
、実装がいかに賢いかに依存します++
。
O(n)
ます。すべてを変更するときの制限は、でなければなりませんがO(n)
、新しいコピーの作成を延期して時間を節約するか、元のマップの代わりに変更セットを読み取ることでアクセス時間を2倍にすることができます。どちらが最もパフォーマンスが良いかは、おそらくユースケースによって異なります。
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)
mutable.Map#apply
もう少し定型と。
以降Scala 2.13
、以下を適用したファクトリビルダーを介して.to(factory)
:
Map(1 -> "a", 2 -> "b").to(collection.mutable.Map)
// collection.mutable.Map[Int,String] = HashMap(1 -> "a", 2 -> "b")
Map
immutableから取得したデフォルト値を持つ空のミュータブルを作成するバリアントがあります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