¿Cómo puedo convertir inmutable.Map en mutable.Map en Scala para poder actualizar los valores en Map?¿Cómo puedo convertir inmutable.Map en mutable.Map en Scala?
Respuesta
val myImmutableMap = collection.immutable.Map(1->"one",2->"two")
val myMutableMap = collection.mutable.Map() ++ myImmutableMap
¿Qué le parece usar 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)
* Es * genial, pero básicamente hace lo mismo que 'mutable.Map # apply' con un poco más repetitivo. –
Existe una variante para crear un vacío mutable Map
que tiene valores por defecto tomados de la inmutable Map
. Es posible almacenar un valor y reemplazar el valor predeterminado en cualquier momento:
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
Advertencia (ver el comentario de Rex Kerr): Usted no será capaz de eliminar los elementos que vienen del mapa inmutable:
scala> mMap.remove(1)
//res5: Option[String] = None
scala> mMap(1)
//res6: String = one
Esto es útil en algunos casos, pero tenga en cuenta que no puede eliminar un elemento en su nuevo mapa que estaba presente en su mapa predeterminado; solo puede cubrir y descubrir los valores predeterminados. –
Correcto, esta solución es parcial. –
La manera más limpia sería usar la fábrica mutable.Map
varargs. A diferencia del enfoque ++
, este utiliza el mecanismo CanBuildFrom
, y por lo tanto tiene el potencial de ser más eficiente si el código de la biblioteca fue escrito para tomar ventaja de esto:
val m = collection.immutable.Map(1->"one",2->"Two")
val n = collection.mutable.Map(m.toSeq: _*)
Esto funciona porque un Map
también puede ser visto como una secuencia de pares.
¿Puede explicarnos qué sintaxis usa en la segunda línea al pasar el parámetro? ¿Qué hace el colon? – Heinzi
': _ *' es muy parecido a la adscripción de tipos, diciéndole al compilador exactamente qué tipo asignar a una expresión dada. Puede pensarlo aquí diciendo "tome esta secuencia y trátela como una serie de parámetros vararg". –
Hay algo mal con las bibliotecas de colecciones si este es el más limpio;) – matanster
- 1. Scala: ¿Puedo convertir una Opción en varargs?
- 2. O (1) conversión de mutable.Mapa a inmutable.Map?
- 3. Scala: Mutable vs. Inmutable Object Performance - OutOfMemoryError
- 4. Convertir Scala Establecer en Java (java.util.Set)?
- 5. ¿Cómo puedo usar JUnit ExpectedException en Scala?
- 6. ¿Puedo sobrecargar paréntesis en Scala?
- 7. Cómo convertir JSON a un tipo en Scala
- 8. Cómo convertir Rango a Lista o Matriz en Scala
- 9. ¿Cómo puedo convertir POI HSSFWorkbook en bytes?
- 10. ¿Cómo puedo convertir BitArray en single int?
- 11. ¿Cómo puedo convertir zonas horarias en Perl?
- 12. ¿Cómo puedo convertir NSMutableArray en NSString?
- 13. ¿Cómo puedo convertir 'System.Windows.Input.Key' en 'System.Windows.Forms.Keys'?
- 14. ¿Cómo puedo convertir números en notación científica?
- 15. ¿Cómo puedo convertir Perl en C?
- 16. ¿Cómo puedo convertir TBytes en RawByteString?
- 17. Convertir objeto Scala a XML
- 18. ¿Convertir una matriz a un conjunto mutable en Scala?
- 19. Convertir un Scala Buffer a Java ArrayList
- 20. ¿Cómo puedo convertir una cadena en un número en Perl?
- 21. ¿Cómo puedo convertir un número en texto en Perl?
- 22. ¿Cómo puedo convertir cadenas hexagonales en números en Perl?
- 23. ¿Cómo puedo convertir un número entero en float en Java?
- 24. ¿Cómo puedo convertir una cadena en una lista en Python?
- 25. ¿Cómo puedo convertir bitset en abreviado en C++?
- 26. ¿Cómo puedo convertir DataRowView en DataRow en C#
- 27. ¿Cómo puedo convertir QVariant en QString y viceversa en Qt?
- 28. ¿Cómo puedo convertir una cadena en un flotante en mysql?
- 29. ¿Cómo puedo convertir una cadena en int en Python?
- 30. ¿Puedo desarrollar Lego Mindstorms en Scala?
¿Conoces la complejidad del tiempo asintótico de esto? Sé que Clojure puede convertir cualquiera de sus colecciones persistentes en una "transitoria" (es decir, una mutable con funciones de mutación de tipo lineal) y volver a una persistente en pasos 'O (1)'. Este * parece * ser 'O (n)', aunque eso depende por supuesto de cuán inteligente sea la implementación de '++'. –
@ Jörg - Estoy bastante seguro de que este es 'O (n)'. En el límite a medida que cambia todo, debe ser 'O (n)', aunque podría intentar diferir la creación de la nueva copia para ahorrar tiempo o duplicar los tiempos de acceso leyendo los conjuntos de cambios en lugar del mapa original. Cuál funciona mejor depende probablemente de su caso de uso. –
@Rustem: los mapas no están ordenados. Aparecerán en el orden que deseen (con un mapa hash, normalmente es el orden de la tecla hash). En particular, los mapas inmutables tienen casos especiales para mapas muy pequeños que son diferentes de los mapas mutables. –