2017-09-20 114 views
0
环错误类型不匹配

我正在学习斯卡拉,但我不能往这个代码对于斯卡拉

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 
    } 

} 

编译结果低谷for循环:

(没有的:int)

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

(附:智力)

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. 
} 
^ 

有什么不对?我如何解决它?

感谢很多,达维德

+0

如果'maxHere'开始于'0',maxHere * inputArray(i)怎么会''0'? – jwvh

+0

是啊我的错,我已经纠正它与1尽快为循环工作 –

回答

2

adjacentElementsProduct需要返回Int,你需要把你想在方法的最后返回(外for循环)的东西。

您也可以简化for (i <- 0 to inputArray.length-1)for (i <- inputArray)并用i替换inputArray(i)

+0

确定完美的作品,谢谢 –

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 

} 
2

如果你正在试图做的是返回邻近的非零整数最大的产品,这里有什么更斯卡拉式的方法。

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

解释(有些简化)

认为它是这样的:myArray.scanLeft(init)(op)将建立一个新的Array,看起来像:

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

哦,好吧,让我明白这个结构它扫描数组从0到最后我猜,和它会为所有产品创建一个外部临时结构,以便它可以找到最大值? –

+0

@DavideAmbrosi;已添加说明。 – jwvh