将元素附加到Scala中列出

时间:2014-04-24 17:33:13

标签: scala immutability mutable

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?

indicesfeatValues未填写。我在这里不知所措。

1 个答案:

答案 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(即可变插槽)。