2017-09-20 158 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