繁体   English   中英

附加元素以在Scala中列出

[英]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?

indicesfeatValues没有被填充。 我在这里茫然。

您不能将任何内容附加到不可变的数据结构中,例如存储在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM