附加到以值作为列表的Map

add*_*ons 3 scala

我已经初始化了一个可变的Map(不确定是否应该在这里使用可变的,但首先要使用可变的):

val aKey = "aa"
val myMap = scala.collection.mutable.Map[String, List[String]]()
if (myMap.exists(_._1 == aKey))
    myMap(aKey) = myMap.get(aKey) :: "test"
Run Code Online (Sandbox Code Playgroud)

但是myMap.get(aKey)我收到以下错误:

类型不匹配的预期列表[String]实际选项[String]

我认为我的做法正确地添加到列表中。

Bri*_*ian 6

您可以使用添加到可变映射+=

scala> myMap += ("placeholders" -> List("foo", "bar", "baz"))
res0: scala.collection.mutable.Map[String,List[String]] = Map(placeholders -> List(foo, bar, baz))
Run Code Online (Sandbox Code Playgroud)

将新项目添加到列表中,aKey如注释中所述。

myMap.get("placeholders") match {
 case Some(xs:List[String]) => myMap.update("placeholders", xs :+ "buzz")
 case None => myMap
}
res22: Any = ()

scala> myMap
res23: scala.collection.mutable.Map[String,List[String]] = Map(placeholders -> List(foo, bar, baz, buzz))
Run Code Online (Sandbox Code Playgroud)


Mok*_*Mok 6

一切安好。除了列表追加运算符

向列表中添加一个元素。操作员应该是这样的

myList = element :: myList
myList = myList :: element  // wrong
Run Code Online (Sandbox Code Playgroud)

所以你的程序应该是

val aKey = "aa"
var myMap = scala.collection.mutable.Map[String, List[String]]().withDefaultValues(List())
myMap(aKey) = "test" :: myMap(aKey) 
Run Code Online (Sandbox Code Playgroud)


Oto*_*lez 6

如果您有可变的 Map且该映射内有不可变的 List。这是一个关于如何执行此操作的简单示例。该示例还使用withDefaultValue进行定义- 以便您始终从Map中获取一些内容。

var posts: collection.mutable.Map[Int, List[String]] = collection.mutable.Map().
  withDefaultValue List.empty[String]

def addTag(postID: Int, tag: String): Unit = posts.get(postID) match {
  case Some(xs: List[String]) => posts(postID) = xs :+ tag
  case None => posts(postID) = List(tag)
}

posts(42)
// List[String] = List() 

addTag(42, "tag-a")
addTag(42, "tag-b")
addTag(42, "tag-c")

posts(42)
// List[String] = List(tag-a, tag-b, tag-c)
Run Code Online (Sandbox Code Playgroud)