如何声明空列表,然后在scala中添加string?
我有这样的代码:
val dm = List[String]() val dk = List[Map[String,Object]]() ..... dm.add("text") dk.add(Map("1" -> "ok"))
但它会抛出运行时java.lang.UnsupportedOperationException。
我需要声明空列表或空地图,以及稍后在代码中需要填充的地图。
Scala列表默认是不可变的。 你不能“添加”一个元素,但是你可以通过在前面添加新的元素来形成一个新的列表。 由于它是一个新的列表,你需要重新分配引用(所以你不能使用val)。
var dm = List[String]() var dk = List[Map[String,AnyRef]]() ..... dm = "text" :: dm dk = Map(1 -> "ok") :: dk
operator ::
创build新的列表。 您也可以使用较短的语法:
dm ::= "text" dk ::= Map(1 -> "ok")
注意:在scala中不要使用Object
types, Any
, AnyRef
或AnyVal
。
如果你需要改变东西,请改用ArrayBuffer
或LinkedBuffer
。 但是,最好是这样说:
我需要声明空列表或空地图,以及稍后在代码中需要填充的地图。
而不是这样做,用返回元素的代码填充列表。 这样做有很多方法,我会举几个例子:
// 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
正如大家已经提到的,这不是在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
在scala中默认的集合是不可变的,所以你有一个+方法返回一个添加元素的新列表。 如果你真的需要像add方法一样的东西,你需要一个可变的集合,例如http://www.scala-lang.org/api/current/scala/collection/mutable/MutableList.html ,它有一个+ =方法。
也许你可以在Scala中使用ListBuffers创build空列表,并在稍后添加string,因为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将其转换为列表
在你的情况下,我使用: val dm = ListBuffer[String]()
和val dk = ListBuffer[Map[String,anyRef]]()