使用多重地图
您可能想使用MultiMap
,这是一个可变集合,同构于Map[K, Set[V]]
。使用方法如下:
import collection.mutable
val mm = new mutable.HashMap[Int, mutable.Set[String]] with mutable.MultiMap[Int, String]
然后添加节点:
mm addBinding (key, value)
没有多重地图
另一种选择是坚持不可变的价值观。假设您想避免使用lenses (see scalaz),可以按如下方式添加节点:
nodes += (key -> (value :: (nodes get key getOrElse Nil)))
它在这里工作(回应您的评论):
scala> var nodes = Map.empty[Int, List[String]]
nodes: scala.collection.immutable.Map[Int,List[String]] = Map()
scala> def addNode(key: Int, value: String) =
| nodes += (key -> (value :: (nodes get key getOrElse Nil)))
addNode: (key: Int, value: String)Unit
scala> addNode(1, "Hi")
scala> addNode(1, "Bye")
scala> nodes
res2: scala.collection.immutable.Map[Int,List[String]] = Map(1 -> List(Bye, Hi))
使用 Scalaz
使用 scalaz 库,您可以意识到这只是使用Empty
图案:
nodes += (key -> (value :: ~(nodes get key)))
或者你可以利用这样一个事实:Map
is a monoid:
nodes = nodes |+| Map(key -> List(value))