[英]Appending element to list in Scala
val indices: List[Int] = List()
val featValues: List[Double] = List()
for (f <- feat) {
val q = f.split(':')
if (q.length == 2) {
println(q.mkString("\n")) // works fine, displays info
indices :+ (q(0).toInt)
featValues :+ (q(1).toDouble)
}
}
println(indices.mkString("\n") + indices.length) // prints nothing and 0?
indices
和featValues
没有被填充。 我在这里茫然。
您不能将任何内容附加到不可变的数据结构中,例如存储在val
(不可变的命名插槽)中的List
。
您的代码正在做的是每次都添加一个元素后创建一个新列表,然后将其丢弃(不对其进行任何处理)—列表上的:+
方法不会修改列表(即使它是可变的) list(例如ArrayBuffer
),但总是返回一个新列表。
为了实现您想要的目标,最快的方法(相对于正确的方法)是使用var
(通常是首选):
var xs = List.empty[Int]
xs :+= 123 // same as `xs = xs :+ 123`
或包含可变集合的val
:
import scala.collection.mutable.ArrayBuffer
val buf = ArrayBuffer.empty[Int]
buf += 123
但是,如果您真的想让代码变得惯用 ,则应该使用一种功能方法:
val indiciesAndFeatVals = feat.map { f =>
val Array(q0, q1) = f.split(':') // pattern matching in action
(q0.toInt, q1.toDouble)
}
这将为您提供一对序列,然后您可以将它们unzip
为2个单独的集合:
val (indicies, featVals) = indiciesAndFeatVals.unzip
这种方法将避免使用任何可变数据结构以及var
(即可变插槽)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.