在scala中,for循环中的变量是否可以在循环外使用?

时间:2017-06-06 18:04:12

标签: scala variables for-loop

我在循环中需要更新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);

3 个答案:

答案 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方式进行编写。否则就没有意义了。