Добавление элемента в набор scala, который является значением карты - PullRequest
3 голосов
/ 22 августа 2011

У меня есть следующая карта в Scala:

var m = Map[Int,Set[Int]]()
m += 1 -> Set(1)
m(1) += 2

Я обнаружил, что последняя строка не работает. Я получаю сообщение об ошибке: переназначение в val.

Итак, я попытался

var s = m(1)
s += 2

Затем, когда я сравнил m(1) с s после того, как я добавил к нему 2, их содержимое было другим. Так, как я могу добавить элемент к набору, который является значением карты?

Я пришел из Java / C ++, поэтому то, что я пробовал, кажется мне естественным, но, очевидно, это не в Scala.

Ответы [ 3 ]

10 голосов
/ 22 августа 2011

Вы, вероятно, используете immutable.Map.Вам нужно использовать mutable.Map или заменить набор вместо его модификации другой неизменяемой картой.

Вот ссылка на описание изменяемых и неизменяемых структур данных .

Итак ...

import scala.collection.mutable.Map
var m = Map[Int,Set[Int]]()
m += 1 -> Set(1)
m(1) += 2
4 голосов
/ 22 августа 2011

Я думаю, что вы действительно хотите здесь это MultiMap

import collection.mutable.{Set, Map, HashMap, MultiMap}
val m = new HashMap[Int,Set[Int]] with MultiMap[Int, Int]
m.addBinding(1,1)
m.addBinding(1,2)
m.addBinding(2,3)

Обратите внимание, что m само по себе является val, так как это сама карта, которая теперь изменчива, а не ссылка накарта

На данный момент m теперь будет:

Map(
  1 -> Set(1,2),
  2 -> Set(3)
)

К сожалению, нет неизменного эквивалента MultiMap, и у вас есть для указанияконкретный подкласс mutable.Map, который вы будете использовать во время строительства.

Для всех последующих операций достаточно просто передать объект, набранный как MultiMap[Int,Int]

4 голосов
/ 22 августа 2011

В дополнение к ответу @Stefan: вместо использования изменяемой карты вы можете использовать изменяемый набор

import scala.collection.mutable.{Set => mSet}
var m = Map[Int,mSet[Int]]()
m += 1 -> mSet(1)
m(1)+=2

mSet - это ярлык для изменяемого набора, введенного для уменьшения многословия.

scala> m
res9: scala.collection.immutable.Map[Int,scala.collection.mutable.Set[Int]] = Map(1 -> Set(2, 1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...