Próbuję utworzyć zmienną wartość Map
z wartością domyślną, która tworzy nowy ListBuffer
, gdy żądany element nie znajduje się jeszcze na mapie. Jednakże, podczas gdy nowa mapa jest zwracana jako domyślna, nie pozostaje na mapie. Może tak to działa, pomyślałem, ale kiedy przetestowałem to z Int
, a nie, zrobił dokładnie tak, jak chciałem. Oto kod, który wyjaśnia, co mam na myśli - co robię źle?Map withDefault pustego obiektu ListBuffer w scala
pierwsze, tu jest praca z Map[Int]
:
scala> val a = collection.mutable.Map(1 -> 1).withDefault(i => 0)
a: scala.collection.mutable.Map[Int,Int] = Map(1 -> 1)
scala> a(1) += 1 // adding to an existing element works as expected
scala> a
res48: scala.collection.mutable.Map[Int,Int] = Map(1 -> 2)
scala> a(2) += 1 // what about adding to a non-existing element?
scala> a // the new element has been added to the map
res50: scala.collection.mutable.Map[Int,Int] = Map(1 -> 2, 2 -> 1)
Teraz z Map[ListBuffer[Int]]
:
scala> val b = collection.mutable.Map(1 -> collection.mutable.ListBuffer[Int]()).withDefault(i => collection.mutable.ListBuffer.empty[Int])
b: scala.collection.mutable.Map[Int,scala.collection.mutable.ListBuffer[Int]] = Map(1 -> ListBuffer())
scala> b(1) += 1 // appending to an existing element works as expected
res51: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1)
scala> b
res52: scala.collection.mutable.Map[Int,scala.collection.mutable.ListBuffer[Int]] = Map(1 -> ListBuffer(1))
scala> b(2) += 1 // but appending to a non-existing element...
res53: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1)
scala> b // leaves the map unchanged
res54: scala.collection.mutable.Map[Int,scala.collection.mutable.ListBuffer[Int]] = Map(1 -> ListBuffer(1))
Świetnie, to ma sens - jak mogę to naprawić? Czy muszę to zrobić w trzech linijkach, pobierając element, dołączając do niego, a następnie ustawiając go ponownie? Ponieważ wolałbym tego unikać, jeśli to możliwe! – Russell
Przypuszczam, że mogę zrobić mapę (i) = mapę (i) + = 5, ale wygląda całkiem nieźle. – Russell
Tak, myślę, że tak (oczywiście, zawsze możesz wyodrębnić to do miłej metody pomocnika). –