我有这样的代码:
val dm = List[String]()
val dk = List[Map[String,Object]]()
.....
dm.add("text")
dk.add(Map("1" -> "ok"))
但它会抛出运行时java.lang.UnsupportedOperationException。
我需要声明空列表或空映射以及稍后需要填充它们的一些地方。
答案 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
类型,而是使用Any
,AnyRef
或AnyVal
。
答案 1 :(得分:16)
如果您需要改变内容,请改用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
答案 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]]()