我在循环中需要更新scala中for循环中的变量。我测试了下面的代码并得到了消息"错误:未定义"。变量不为空,在循环内返回值。谢谢。
val example=List(0,0,1,0.7,10,2,5,7,4,1,-9,0,0,0,0,3,3,0,0,0,-80,-6.6,-1,0)
var b=scala.collection.mutable.MutableList.empty[Double]
var b_val:Double=0
for (i<-1 to 24) {
if ( example (i) != 0 ){b_val = b_val + example(i)} else {b_val = 0}
b += b_val;
}
println(b);
答案 0 :(得分:1)
您收到错误,因为example
只有24
项。因此,当example(i)
为IndexOutOfBoundsException
时,i
会抛出24
。
答案 1 :(得分:0)
您正在尝试将b_val
添加到AnyVal
的两倍,这将无效。
所以,要添加你需要将List中的元素强制转换为Double,或者将example
定义为List[Double]
,你的迭代也行不通,因为你正在做to 24
会因为来自0 to 23
val example = List(0, 0, 1, 0.7, 10, 2, 5, 7, 4, 1, -9, 0, 0, 0, 0, 3, 3, 0, 0, 0, -80, -6.6, -1, 0)
var b = scala.collection.mutable.MutableList.empty[Double]
var b_val: Double = 0
for (i <- 0 until example.length) {
if (example(i) != 0) {
b_val = (b_val + example(i).asInstanceOf[Double])
} else {
b_val = 0
}
b += b_val
}
println(b)
结果是:MutableList(0.0, 0.0, 1.0, 1.7, 11.7, 13.7, 18.7, 25.7, 29.7, 30.7, 21.7, 0.0, 0.0, 0.0, 0.0, 3.0, 6.0, 0.0, 0.0, 0.0, -80.0, -86.6, -87.6, 0.0)
但只有你知道你想要实现的目标,我会以scala的方式对它进行小型重构
val example = List(0, 0, 1, 0.7, 10, 2, 5, 7, 4, 1, -9, 0, 0, 0, 0, 3, 3, 0, 0, 0, -80, -6.6, -1, 0)
var b = scala.collection.mutable.MutableList.empty[Double]
var b_val: Double = 0
example.foreach(elem => {
if (elem != 0) {
b_val = b_val + elem.asInstanceOf[Double]
} else {
b_val = 0
}
b += b_val
})
println(b)
答案 2 :(得分:0)
我想,你正在寻找这样的东西:
val b = example.scanLeft(0.0) {
case (_, 0) => 0
case (l, r) => l + r
}
如果您打算编写scala代码,请学习以scala方式进行编写。否则就没有意义了。