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
未填写。我在这里不知所措。
答案 0 :(得分:3)
您不能将任何内容附加到存储在List
(不可变命名槽)中的val
等不可变数据结构中。
你的代码正在做的是每次创建一个新的列表,附加一个元素,然后扔掉它(通过不做任何事情) - 列表上的:+
方法不会修改列表到位(即使它是一个可变列表,例如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
s(即可变插槽)。