2010-10-22 4 views

ответ

13

Когда вы говорите

val map = scala.collection.mutable.Map 

вы не создаете экземпляр карты, но вместо наложения типа карты.

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

Попробуйте вместо этого следующее:

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

Дело в том, что первая строка ваших кодов не то, что вы ожидали. Вы должны использовать

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

или

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

вместо этого.

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

Увы, при использовании 'new' пустые круглые скобки не нужны. –

40

Как всегда, вы должны задать вопрос, действительно ли вам нужна изменчивая карта.

Неизменные карты не тривиальны строить:

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

Mutable карты не отличаются, когда первый строится:

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

map += "nextkey" -> "nextval" 

В обоих этих случаях, вывод будет использоваться для определения правильного типа параметры экземпляра карты.

Вы также можете провести непреложную карту в var, переменный будет обновляться с новым экземпляром неизменной карты каждый раз, когда вы выполняете «обновление»

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

map += "nextkey" -> "nextval" 

Если у вас нет какого-либо начальных значения, вы можете использовать карту.пусто:

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

Предположим, что у меня есть класс с полем Map и его можно обновить в любое время; действительно ли в Scala предпочтительнее иметь «вар» + неизменяемую карту, а не «вал» + измененную карту? Будучи опытным программистом на Java, я бы выбрал второй вариант, но из вашего ответа я предполагаю, что первый в мире Scala более распространен? –

+0

И если вы хотите добавить сразу несколько записей: 'map ++ Seq (« another1 »->« anotherVal1 »,« another2 »->« anotherVal2 »)' –

2

Создать новую неизменяемую карту:

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

Добавить новый ключ/значение пары на карте выше (и создать новую карту, так как они оба неизменны):

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

Создать изменяемую карту без начального значения:

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

Создать изменяемую карту с начальными значениями:

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) 

Обновить существующий ключ-значение:

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

Добавить новый ключ-значение:

scala> d(100)= "new element" 

Проверьте обновленную карту:

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