¿Cuál es la sintaxis para agregar un elemento a scala.collection.mutable.Map?

81

¿Cuál es la sintaxis para agregar un elemento a scala.collection.mutable.Map?

A continuación se muestran algunos intentos fallidos:

val map = scala.collection.mutable.Map

map("mykey") = "myval"

map += "mykey" -> "myval"

map.put("mykey","myval")
Koala3
fuente
Tal comentario revela cuán mal se nombran las funciones de Scala y cuán contradictorio es.
Adelin

Respuestas:

93

El caso es que la primera línea de sus códigos no es la que esperaba.

Deberías usar:

val map = scala.collection.mutable.Map[A,B]()

Luego tiene varias alternativas equivalentes para agregar elementos:

scala> val map = scala.collection.mutable.Map[String,String]()
map: scala.collection.mutable.Map[String,String] = Map()


scala> map("k1") = "v1"

scala> map
res1: scala.collection.mutable.Map[String,String] = Map((k1,v1))


scala> map += "k2" -> "v2"
res2: map.type = Map((k1,v1), (k2,v2))


scala> map.put("k3", "v3")
res3: Option[String] = None

scala> map
res4: scala.collection.mutable.Map[String,String] = Map((k3,v3), (k1,v1), (k2,v2))

Y comenzando Scala 2.13:

scala> map.addOne("k4" -> "v4")
res5: map.type = HashMap(k1 -> v1, k2 -> v2, k3 -> v3, k4 -> v4)
Eastsun
fuente
4
Por desgracia, cuando se utilizan newlos paréntesis vacíos son innecesarios.
Daniel C. Sobral
45

Como siempre, debe preguntarse si realmente necesita un mapa mutable.

Los mapas inmutables son triviales de construir:

val map = Map(
  "mykey" -> "myval",
  "myotherkey" -> "otherval"
)

Los mapas mutables no son diferentes cuando se construyen por primera vez:

val map = collection.mutable.Map(
  "mykey" -> "myval",
  "myotherkey" -> "otherval"
)

map += "nextkey" -> "nextval"

En ambos casos, la inferencia se utilizará para determinar los parámetros de tipo correctos para la instancia de Map.

También puede mantener un mapa inmutable en a var, la variable se actualizará con una nueva instancia de mapa inmutable cada vez que realice una "actualización"

var map = Map(
  "mykey" -> "myval",
  "myotherkey" -> "otherval"
)

map += "nextkey" -> "nextval"

Si no tiene ningún valor inicial, puede usar Map.empty:

val map : Map[String, String] = Map.empty //immutable
val map = Map.empty[String,String] //immutable
val map = collection.mutable.Map.empty[String,String] //mutable
Kevin Wright
fuente
2
Digamos que tengo una clase con un campo Mapa y que se puede actualizar en cualquier momento; ¿Es realmente preferido en Scala tener un mapa 'var' + inmutable en lugar de 'val' + mapa mutable? Como programador experimentado de Java, elegiría la segunda opción, pero por tu respuesta supongo que la primera es más común en el mundo Scala
omnomnom
1
Y si desea agregar varias entradas a la vez:map ++ Seq("another1" -> "anotherVal1", "another2" -> "anotherVal2")
Brent Faust
18

Cuando tu dices

val map = scala.collection.mutable.Map

no está creando una instancia de mapa, sino creando un alias del tipo de mapa.

map: collection.mutable.Map.type = scala.collection.mutable.Map$@fae93e

En su lugar, intente lo siguiente:

scala> val map = scala.collection.mutable.Map[String, Int]()
map: scala.collection.mutable.Map[String,Int] = Map()

scala> map("asdf") = 9

scala> map
res6: scala.collection.mutable.Map[String,Int] = Map((asdf,9))
Synesso
fuente
3

Crea un nuevo mapa inmutable:

scala> val m1 = Map("k0" -> "v0")   
m1: scala.collection.immutable.Map[String,String] = Map(k0 -> v0)

Agregue un nuevo par clave / valor al mapa anterior (y cree un nuevo mapa, ya que ambos son inmutables):

scala> val m2 = m1 + ("k1" -> "v1")             
m2: scala.collection.immutable.Map[String,String] = Map(k0 -> v0, k1 -> v1)
0nIce
fuente
2
var test = scala.collection.mutable.Map.empty[String, String]
test("myKey") = "myValue"
kkress
fuente
2

Crea un mapa mutable sin valor inicial:

scala> var d= collection.mutable.Map[Any, Any]()
d: scala.collection.mutable.Map[Any,Any] = Map()

Crea un mapa mutable con valores iniciales:

scala> var d= collection.mutable.Map[Any, Any]("a"->3,1->234,2->"test")
d: scala.collection.mutable.Map[Any,Any] = Map(2 -> test, a -> 3, 1 -> 234)

Actualice el valor-clave existente:

scala> d("a")= "ABC"

Agregar nuevo valor-clave:

scala> d(100)= "new element"

Consulta el mapa actualizado:

scala> d
res123: scala.collection.mutable.Map[Any,Any] = Map(2 -> test, 100 -> new element, a -> ABC, 1 -> 234)
Andy Dong
fuente
0

var map: Map [String, String] = Map ()

var map1 = map + ("rojo" -> "# FF0000")

println (mapa1)

subhranil ghosh
fuente
1
Ese pobre pedacito de código asustado y solitario pide compañía y protección con una explicación.
Yunnosch
3
Bienvenido a SO. Con preguntas tan antiguas (se hicieron hace más de 10 años), y con tantas respuestas ya enviadas, es útil señalar cómo su respuesta agrega algo nuevo al tema. Tal como está, su publicación muestra un estilo Scala muy pobre.
jwvh