如何附加到一个listbuffer,它是Scala中可变映射的值?

时间:2015-10-07 02:57:51

标签: scala

val mymap= collection.mutable.Map.empty[String,Seq[String]]
mymap("key") = collection.mutable.ListBuffer("a","b")
mymap.get("key") += "c"

要追加到列表缓冲区的最后一行是错误的。如何进行追加?

3 个答案:

答案 0 :(得分:2)

在scala控制台中运行代码时:

→$scala
scala> val mymap= collection.mutable.Map.empty[String,Seq[String]]
mymap: scala.collection.mutable.Map[String,Seq[String]] = Map()

scala> mymap("key") = collection.mutable.ListBuffer("a","b")

scala> mymap.get("key")
res1: Option[Seq[String]] = Some(ListBuffer(a, b))

您会看到mymap.get("key")是可选类型。您无法将字符串添加到可选类型。

此外,由于您向mymap键入了Seq[String],因此Seq[String]没有+=运算符接收字符串。

以下作品:

val mymap= collection.mutable.Map.empty[String,collection.mutable.ListBuffer[String]]
mymap("key") = collection.mutable.ListBuffer("a","b")
mymap.get("key").map(_ += "c")

使用.map函数将利用可选类型,并像Łukasz所说的那样阻止noSuchElementException。

答案 1 :(得分:0)

一次处理一个问题:

  1. Map.get返回Option[T]Option未提供+=+方法。
  2. 即使您使用Map.applymymap("key")),apply的返回类型也会是V(在这种情况下为Seq),无论实际是什么具体类型是(VectorListSet等。 Seq未提供+=方法,其+方法需要另一个Seq
  3. 鉴于此,要获得您想要的内容,您需要将Map的类型声明为可变类型:

    import collection.mutable.ListBuffer
    val mymap= collection.mutable.Map.empty[String,ListBuffer[String]]
    mymap("key") = ListBuffer("a","b")
    mymap("key") += "c"
    

    将按预期工作。

答案 2 :(得分:0)

如果你真的想拥有不可变的价值,那么这样的事情也应该有效:

val mymap= collection.mutable.Map.empty[String,Seq[String]]
mymap("key") = Vector("a","b")
val oldValue = mymap.get("key").getOrElse(Vector[String]())
mymap("key") = oldValue :+ "c"

我在这里使用了Vector,因为在List的末尾添加元素在设计上是无效的。