Nasıl dönüştürebilirsiniz immutable.Map
için mutable.Map
ben değerleri güncelleyebilirsiniz böylece Scala Map
?
Nasıl dönüştürebilirsiniz immutable.Map
için mutable.Map
ben değerleri güncelleyebilirsiniz böylece Scala Map
?
Yanıtlar:
En temiz yol, mutable.Map
varargs fabrikasını kullanmak olacaktır . ++
Yaklaşımdan farklı olarak , bu CanBuildFrom
mekanizmayı kullanır ve bundan yararlanmak için kütüphane kodu yazıldıysa daha verimli olma potansiyeline sahiptir:
val m = collection.immutable.Map(1->"one",2->"Two")
val n = collection.mutable.Map(m.toSeq: _*)
Bu işe yarar çünkü a Map
aynı zamanda bir Çift dizisi olarak da görülebilir.
: _*
tür tanımına çok benzer, derleyiciye belirli bir ifadeye tam olarak hangi türü atayacağını söyler. Burada "bu diziyi al ve onu bir dizi vararg parametresi olarak ele al" dediğini düşünebilirsiniz.
val myImmutableMap = collection.immutable.Map(1->"one",2->"two")
val myMutableMap = collection.mutable.Map() ++ myImmutableMap
O(1)
adım adım kalıcı bir koleksiyona dönüştürebileceğini biliyorum . Bu bakışlar olmaya O(n)
Bunun ne kadar zeki uygulanmasına ilişkin elbette bağlı olsa da, ++
olduğunu.
O(n)
. Sınırda her şeyi değiştirdiğinizde, O(n)
zaman kazanmak için yeni kopyanın oluşturulmasını ertelemeyi deneyebilirsiniz veya orijinal harita yerine değişiklik kümelerini okuyarak erişim sürelerinizi ikiye katlayabilirsiniz. Hangisinin en iyi performansı gösterdiği muhtemelen kullanım durumunuza bağlıdır.
Scala 2.13
Aşağıdakilerle uygulanan fabrika üreticileri aracılığıyla başlangıç .to(factory)
:
Map(1 -> "a", 2 -> "b").to(collection.mutable.Map)
// collection.mutable.Map[Int,String] = HashMap(1 -> "a", 2 -> "b")
Collection.breakOut kullanmaya ne dersiniz?
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
, daha klişe bit ile.
Map
Değişmezden alınan varsayılan değerlere sahip boş bir değişken oluşturmanın bir varyantı vardır Map
. İstediğiniz zaman bir değer saklayabilir ve varsayılanı geçersiz kılabilirsiniz:
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
Uyarı (Rex Kerr'in yorumuna bakın): Değişmez haritadan gelen unsurları kaldıramayacaksınız:
scala> mMap.remove(1)
//res5: Option[String] = None
scala> mMap(1)
//res6: String = one
Scala 2.13 ile iki alternatif vardır: to
kaynak eşleme örneğinin from
yöntemi veya hedef haritanın yardımcı nesnesinin yöntemi.
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)
Gördüğünüz gibi, mutable.Map
uygulamaya kütüphane tarafından karar verildi. Örneğin mutable.HashMap
, belirli bir uygulama seçmek istiyorsanız , tüm oluşumlarını mutable.Map
ile değiştirin mutable.HashMap
.