2010-10-22 10 views

Odpowiedz

13

Kiedy mówisz

val map = scala.collection.mutable.Map 

nie tworzysz instancję mapy, ale zamiast aliasing typ mapy.

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

Spróbuj zamiast następujące:

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

Chodzi o to, że pierwsza linia kodów nie jest to, czego oczekiwano. Należy użyć

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

lub

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

zamiast.

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

Niestety, podczas korzystania "nowy" pusty nawias jest niepotrzebny. –

40

Jak zwykle powinieneś zadać sobie pytanie, czy naprawdę potrzebujesz mapki, którą można modyfikować.

niezmiennymi mapy są trywialne budować:

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

Zmienne mapy nie różnią się po raz pierwszy w trakcie budowy:

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

map += "nextkey" -> "nextval" 

W obu tych przypadkach wnioskowanie zostaną wykorzystane w celu określenia właściwego typu parametry dla instancji Map.

Można również posiadać mapę niezmienny w var, zmienna zostanie wzbogacona o nowe niezmiennej przykład mapy za każdym razem, gdy wykonujesz „Update”

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

map += "nextkey" -> "nextval" 

Jeśli nie ma żadnych początkowa wartości, możesz użyć mapy.puste:

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

Załóżmy, że mam klasę z polem Mapy i że może być ona aktualizowana w dowolnym momencie; czy w Scali naprawdę preferuje się mapę "var" + niezmienną, a nie "val" + mapę zmienną? Jako doświadczony programista Java wybrałbym drugą opcję, ale z twojej odpowiedzi zakładam, że pierwszy jest bardziej popularny w świecie Scala? –

+0

A jeśli chcesz dodać wiele wpisów jednocześnie: 'map ++ Seq (" another1 "->" anotherVal1 "," another2 "->" anotherVal2 ")' –

2

Utwórz nową mapę niezmienny:

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

dodać nową parę klucz/wartość na powyższej mapie (i utworzyć nową mapę, ponieważ obaj są niezmienne):

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

Tworzenie mapy zmienny bez wartości początkowej:

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

Tworzenie mapy zmienny z wartościami początkowymi:

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) 

Aktualizuj istniejący klucz-wartość:

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

Dodaj nowy klucz-wartość:

scala> d(100)= "new element" 

sprawdzić zaktualizowaną mapę:

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