Jaka jest składnia dodawania elementu do scala.collection.mutable.Map?


81

Jaka jest składnia dodawania elementu do scala.collection.mutable.Map?

Oto kilka nieudanych prób:

val map = scala.collection.mutable.Map

map("mykey") = "myval"

map += "mykey" -> "myval"

map.put("mykey","myval")

Taki komentarz ujawnia, jak źle nazywane są funkcje Scala i jak sprzeczne z intuicją!
Adelin

Odpowiedzi:


93

Chodzi o to, że pierwsza linia twoich kodów nie jest tym, czego się spodziewałeś.

Powinieneś użyć:

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

Masz wtedy wiele równoważnych alternatyw do dodawania elementów:

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

I zaczynając Scala 2.13:

scala> map.addOne("k4" -> "v4")
res5: map.type = HashMap(k1 -> v1, k2 -> v2, k3 -> v3, k4 -> v4)

4
Niestety, użycie newpustego nawiasu nie jest konieczne.
Daniel C. Sobral

45

Jak zawsze powinieneś zapytać, czy naprawdę potrzebujesz mutowalnej mapy.

Niezmienne mapy są łatwe do zbudowania:

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

Mapy mutowalne nie różnią się od siebie, gdy są budowane po raz pierwszy:

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

map += "nextkey" -> "nextval"

W obu tych przypadkach wnioskowanie będzie używane do określenia poprawnych parametrów typu dla instancji Map.

Możesz także przechowywać niezmienną mapę w a var, zmienna zostanie wówczas zaktualizowana o nową niezmienną instancję mapy za każdym razem, gdy wykonasz „aktualizację”

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

map += "nextkey" -> "nextval"

Jeśli nie masz żadnych wartości początkowych, możesz użyć 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

2
Powiedzmy, że mam klasę z polem mapy i można ją zaktualizować w dowolnym momencie; czy naprawdę preferuje się w Scali posiadanie mapy „var” + niezmiennej zamiast „val” + mapy mutowalnej? Jako doświadczony programista Java wybrałbym drugą opcję, ale z twojej odpowiedzi zakładam, że pierwsza jest bardziej powszechna w świecie Scala?
omnomnom

1
A jeśli chcesz dodać wiele wpisów na raz:map ++ Seq("another1" -> "anotherVal1", "another2" -> "anotherVal2")
Brent Faust

18

Kiedy powiesz

val map = scala.collection.mutable.Map

nie tworzysz instancji mapy, ale zamiast tego tworzysz aliasy typu mapy.

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

Zamiast tego spróbuj wykonać następujące czynności:

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

3

Utwórz nową niezmienną mapę:

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

Dodaj nową parę klucz / wartość do powyższej mapy (i utwórz nową mapę, ponieważ obie są niezmienne):

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

2
var test = scala.collection.mutable.Map.empty[String, String]
test("myKey") = "myValue"

2

Utwórz zmienną mapę bez wartości początkowej:

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

Utwórz zmienną mapę 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)

Zaktualizuj istniejącą parę klucz-wartość:

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

Dodaj nową parę klucz-wartość:

scala> d(100)= "new element"

Sprawdź zaktualizowaną mapę:

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

0

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

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

println (mapa1)


1
Ten biedny, przerażony i samotny kod błaga o towarzystwo i ochronę przez wyjaśnienie.
Yunnosch

3
Witamy w SO. Przy tak starych pytaniach (zadawano je ponad 10 lat temu) i przy tak wielu już udzielonych odpowiedziach warto wskazać, w jaki sposób Twoja odpowiedź dodaje coś nowego do tematu. W rzeczywistości Twój post ma bardzo kiepski styl Scala.
jwvh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.