我正在学习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
答案 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
}