2017-09-20 4 views
0

ich lerne Scala, aber ich bin nicht in der Lage die for-Schleife in diesem Code Trog gehenFor-Schleife Mismatch Fehlertyp in Scala

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 
    } 

} 

Compiler Ergebnisse:

(ohne: Int)

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

(mit: 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. 
} 
^ 

Was ist los? Wie kann ich es lösen?

Vielen Dank, Davide

+0

Wenn 'maxHere' beginnt bei '0', wie kann' maxHere * inputArray (i) 'jemals'> 0' sein? – jwvh

+0

yeah mein Fehler, ich habe es mit 1 korrigiert, sobald die for-Schleife funktioniert –

Antwort

2

adjacentElementsProduct Bedürfnisse ein Int zurückzukehren, müssen Sie setzen, was Sie am Ende des Verfahrens zurückkehren wollen (außerhalb der for-Schleife).

Sie können auch for (i <- 0 to inputArray.length-1) zu for (i <- inputArray) vereinfachen und inputArray(i) durch i ersetzen.

+0

ok perfekt es funktioniert, danke –

1

der Rückgabewert maxSoFar sollte die aus for-Schleife {}, wie folgt aus:

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

Wenn das maximale Produkt von benachbarten nicht-Null ganzen Zahlen zu tun, was Sie versuchen, hier wird zurückkehren ein mehr ist Scala-esque Ansatz.

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

Erklärung (etwas vereinfacht)

Betrachten Sie es auf diese Weise: myArray.scanLeft(init)(op) wird ein neues Array bauen, wie etwas aussieht:

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

oh ok, lassen Sie mich mit dieser Struktur verstehen scannen Sie das Array von 0 bis zum Ende, ich denke, und es schafft eine externe temporäre Struktur mit allen Produkten, so dass es den maximalen Wert finden kann? –

+0

@DavideAmbrosi; Erklärung hinzugefügt. – jwvh