2010-10-22 10 views

risposta

13

Quando si dice

val map = scala.collection.mutable.Map 

non si sta creando un'istanza di mappa, ma invece di aliasing il tipo di mappa.

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

Prova invece la seguente:

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

Il punto è che la prima linea dei codici non è quello che vi aspettavate. Si dovrebbe usare

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

o

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

invece.

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

Ahimè, quando si utilizza 'new'le parentesi vuote non sono necessarie. –

40

Come sempre, dovresti chiedere se hai davvero bisogno di una mappa mutabile.

mappe immutabili sono banali per costruire:

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

mappe mutabili non sono diverse al momento della prima fase di costruzione:

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

map += "nextkey" -> "nextval" 

In entrambi i casi, l'inferenza saranno utilizzati per determinare il tipo corretto parametri per l'istanza Map.

È possibile anche tenere una mappa immutabile in una var, la variabile verrà poi aggiornato con una nuova istanza mappa immutabile ogni volta che si esegue un "aggiornamento"

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

map += "nextkey" -> "nextval" 

Se non si dispone di alcun iniziale valori, puoi usare Map.vuoto:

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

Diciamo che ho una classe con un campo Mappa e che può essere aggiornata in qualsiasi momento; è davvero preferibile in Scala avere una "var" + mappa immutabile piuttosto che una "val" + mappa mutabile? Come programmatore Java esperto, opterei per la seconda opzione, ma dalla tua risposta presumo che la prima sia più comune nel mondo di Scala? –

+0

E se si desidera aggiungere più voci contemporaneamente: 'map ++ Seq (" another1 "->" anotherVal1 "," another2 "->" anotherVal2 ")' –

2

creare una nuova mappa immutabile:

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

aggiungere una nuova coppia chiave/valore per la mappa qui sopra (e creare una nuova mappa, dato che sono entrambi immutabili):

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

creare una mappa mutevole senza valore iniziale:

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

Creare una mappa mutevole con i valori iniziali:

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) 

Aggiornare il valore-chiave:

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

Aggiungi nuovo valore-chiave:

scala> d(100)= "new element" 

controllare la mappa aggiornata:

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