2010-10-22 4 views

Respuesta

13

Cuando dicen

val map = scala.collection.mutable.Map 

no va a crear una instancia de un mapa, pero en su lugar crear un alias del tipo de mapa.

map: collection.mutable.Map.type = [email protected] 

Procurad, más bien 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)) 
2
var test = scala.collection.mutable.Map.empty[String, String] 
test("myKey") = "myValue" 
72

El punto es que la primera línea de los códigos no es lo que esperaba. Debe utilizar

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

o

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

lugar.

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)) 
+3

Por desgracia, al utilizar 'new'the empty parenthesis son innecesarios. –

40

Como siempre, debería preguntarse si realmente necesita un mapa mutable.

mapas inmutables son triviales para construir:

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

mapas mutables no son diferentes cuando la primera está construyendo:

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

map += "nextkey" -> "nextval" 

En ambos casos, la inferencia se utilizarán para determinar el tipo correcto parámetros para la instancia de Mapa.

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

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

map += "nextkey" -> "nextval" 

Si usted no tiene ninguna inicial valores, puede usar Map.vacío:

val map : Map[String, String] = Map.empty //immutable 
val map = Map.empty[String,String] //immutable 
val map = collection.mutable.Map.empty[String,String] //mutable 
+2

Digamos que tengo una clase con un campo de Mapa y que se puede actualizar en cualquier momento; ¿Es realmente preferido en Scala tener un mapa "var" + inmutable en lugar de un mapa "val" + mutable? Como programador con experiencia en Java, elegiría la segunda opción, pero a partir de su respuesta supongo que la primera es más común en el mundo de Scala. –

+0

Y si quiere agregar varias entradas a la vez: 'map ++ Seq (" another1 "->" anotherVal1 "," another2 "->" anotherVal2 ")' –

2

Crear un nuevo mapa inmutable:

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

Añadir un nuevo par clave/valor al mapa de arriba (y crear 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) 
0

crear un mapa mutable y sin valor inicial:

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

crear un mapa mutable con los 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) 

actualización existente de valores clave:

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

Añadir nueva clave-valor:

scala> d(100)= "new element" 

Consulte el mapa más actualizado:

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