对于Scala中的循环错误类型不匹配

时间:2017-09-20 10:10:22

标签: scala for-loop type-mismatch

我正在学习Scala,但我无法通过此代码中的for循环

    def adjacentElementsProduct(inputArray: Array[Int]): Int = {

    var maxSoFar = 0
    var maxHere = 0

    //for (i <- 0:Int to (inputArray.length-1))      <- error
    for (i <- 0 to inputArray.length-1)            //<- error
    {
          if( maxHere * inputArray(i) > 0 )
                maxHere *= inputArray(i)
          else
                maxHere = 0

          if( maxHere > maxSoFar )
                maxSoFar = maxHere

          maxSoFar
    }

}

编译器结果:

(不含:Int)

  file.scala on line 6: error: type mismatch;
 found   : Unit
 required: Int
        for (i <- 0 to inputArray.length-1)
               ^

(with:Int)

file.scala on line 6: error: identifier expected but integer literal found.
    for (i <- 0:Int to (inputArray.length - 1) )
                                            ^
file.scala on line 19: error: ')' expected but '}' found.
}
^

有什么问题?我怎么解决呢?

非常感谢,Davide

3 个答案:

答案 0 :(得分:2)

adjacentElementsProduct需要返回Int,你需要在方法结束时(在for循环之外)放置你想要返回的内容。

此外,您可以将for (i <- 0 to inputArray.length-1)简化为for (i <- inputArray),并将inputArray(i)替换为i

答案 1 :(得分:2)

如果你要做的是返回相邻非零整数的最大乘积,那么这里有一个更加斯卡拉式的方法。

def adjacentElementsProduct(inputArray: Array[Int]): Int =
  inputArray.scanLeft(0)((a,b) => if (a==0) b else a*b).max

解释(稍微简化)

以这种方式思考:myArray.scanLeft(init)(op)将构建一个类似于:{/ p>的新Array

Array( init
     , op(init,             myArray(0))
     , op(previousOpResult, myArray(1))
     , op(previousOpResult, myArray(2))
     . . .
     )

答案 2 :(得分:1)

返回值maxSoFar应该出于for循环{},如下所示:

def adjacentElementsProduct(inputArray: Array[Int]): Int = {

    var maxSoFar = 0
    var maxHere = 0

    //for (i <- 0:Int to (inputArray.length-1))      <- error
    for (i <- 0 to inputArray.length-1)            //<- error
    {
          if( maxHere * inputArray(i) > 0 )
                maxHere *= inputArray(i)
          else
                maxHere = 0

          if( maxHere > maxSoFar )
                maxSoFar = maxHere


    }
    maxSoFar

}