如何声明空列表然后在scala中添加字符串?

时间:2011-07-02 13:03:24

标签: scala

我有这样的代码:

val dm  = List[String]()
val dk = List[Map[String,Object]]()

.....

dm.add("text")
dk.add(Map("1" -> "ok"))

但它会抛出运行时java.lang.UnsupportedOperationException。

我需要声明空列表或空映射以及稍后需要填充它们的一些地方。

7 个答案:

答案 0 :(得分:101)

默认情况下,Scala列表是不可变的。您不能“添加”元素,但可以通过在前面附加新元素来形成新列表。由于它是 new 列表,您需要重新分配引用(因此您不能使用val)。

var dm  = List[String]()
var dk = List[Map[String,AnyRef]]()

.....

dm = "text" :: dm
dk = Map(1 -> "ok") :: dk

运营商::创建新列表。您还可以使用较短的语法:

dm ::= "text" 
dk ::= Map(1 -> "ok")

NB:在scala中,请勿使用Object类型,而是使用AnyAnyRefAnyVal

答案 1 :(得分:16)

如果您需要改变内容,请改用ArrayBufferLinkedBuffer。但是,最好是解决这个问题:

  

我需要声明空列表或空   地图和稍后在代码中的一些地方   需要填补它们。

不是这样做,而是使用返回元素的代码填充列表。有很多方法可以做到这一点,我将举几个例子:

// Fill a list with the results of calls to a method
val l = List.fill(50)(scala.util.Random.nextInt)

// Fill a list with the results of calls to a method until you get something different
val l = Stream.continually(scala.util.Random.nextInt).takeWhile(x => x > 0).toList

// Fill a list based on its index
val l = List.tabulate(5)(x => x * 2)

// Fill a list of 10 elements based on computations made on the previous element
val l = List.iterate(1, 10)(x => x * 2)

// Fill a list based on computations made on previous element, until you get something
val l = Stream.iterate(0)(x => x * 2 + 1).takeWhile(x => x < 1000).toList

// Fill list based on input from a file
val l = (for (line <- scala.io.Source.fromFile("filename.txt").getLines) yield line.length).toList

答案 2 :(得分:13)

正如大家已经提到的,这不是在Scala中使用列表的最佳方式......

scala> val list = scala.collection.mutable.MutableList[String]()
list: scala.collection.mutable.MutableList[String] = MutableList()

scala> list += "hello"
res0: list.type = MutableList(hello)

scala> list += "world"
res1: list.type = MutableList(hello, world)

scala> list mkString " "
res2: String = hello world

答案 3 :(得分:2)

scala中的每个默认集合都是不可变的,因此您有一个+方法,它返回一个添加了元素的新列表。 如果你真的需要类似add方法的东西,你需要一个可变的集合,例如http://www.scala-lang.org/api/current/scala/collection/mutable/MutableList.html有一个+ =方法。

答案 4 :(得分:1)

如上文answer所述,Scala List是一个不可变的集合。您可以使用 .empty[A] 创建一个空列表。然后,您可以使用方法:++:::将元素添加到列表中。

scala> val strList = List.empty[String]
strList: List[String] = List()

scala> strList:+ "Text"
res3: List[String] = List(Text)

scala> val mapList = List.empty[Map[String, Any]]
mapList: List[Map[String,Any]] = List()

scala> mapList :+ Map("1" -> "ok")
res4: List[Map[String,Any]] = List(Map(1 -> ok))

答案 5 :(得分:0)

也许你可以在scala中使用ListBuffers创建空列表并稍后添加字符串,因为ListBuffers是可变的。此外,所有List函数都可用于scala中的ListBuffers。

import scala.collection.mutable.ListBuffer 

val dm = ListBuffer[String]()
dm: scala.collection.mutable.ListBuffer[String] = ListBuffer()
dm += "text1"
dm += "text2"
dm = ListBuffer(text1, text2)

如果您愿意,可以使用.toList

将其转换为列表

答案 6 :(得分:0)

在您的情况下,我使用:val dm = ListBuffer[String]()val dk = ListBuffer[Map[String,anyRef]]()