2017-06-05 5 views
1

Ich bin hypnotisiert. Der folgende Code gibt mir einen Indexoutofbound-Fehler. Aber wenn ich die Schrägstriche löschen würde, die for(j <- i until tmpArray.length) ermöglichen, würde es funktionieren. Ich verstehe wirklich nicht, warum das passiert, und würde mich über eine Erklärung freuen.ObservableBuffer geben IndexOutOfBounds in Scala

+0

warum versuchst du 'ArrayBuffer' anstelle von' ObservableBuffer'? –

Antwort

3

Sie ändern das Array, während Sie darüber "iterieren".

Sie durchlaufen tatsächlich den Bereich 0 until tmpArray.length, der im Voraus berechnet wird. Irgendwann reduzierst du die Länge des Arrays (oder ich nehme an, dass ich remove auf der Array Klasse nicht finden kann). Aber es wird weiterhin die Iteration bis zu dem letzten Index fortsetzen, als Sie den Bereich erstellt haben.

Wenn Sie den inneren for Block auskommentieren, wird der Bereich für jeden Schritt des äußeren for erneut berechnet. Und es passiert einfach, dass die Palette einfach nichts hat, wenn i >= tmpArray.length. Es schützt also unabsichtlich vor diesem Versagen.

Dies ist sehr C-style (Imperativ) -Code. Es sieht so aus, als würden Sie nur versuchen, einige Elemente aus einem Array zu entfernen. Das ist, was filter ist für.

val result = tmpArray.filter { d => 
    if(date.getValue != null && d != date.getValue) false else true 
} 

Dies schafft einen neuen array (result) von einer anonymen Funktion tmpArray.filter geben. Es übergibt jedes Element im Array an Ihr "Prädikat", und wenn es true zurückgibt, behält es das Element in result, andernfalls wird es es weglassen.

Sie sollten beachten, dass ich vermieden habe, "Schleife" zu sagen. Scala for ist nicht für die Herstellung von Schleifen. Es ist eigentlich Syntax Zucker zum Aufrufen von Methoden wie foreach und map. Google "scala for comprehensions" für mehr Details.

Wenn Sie darauf bestehen, eine C-style-Schleife zu erstellen, die Indizes und eine Schleifenvariable verwendet, sollten Sie while verwenden, so dass Sie jedes Mal überprüfen können, ob i < tmpArray.length ist.

+1

Danke! Hat viel geholfen. Ich bin C gewohnt, ich habe letzten Monat mit Scala angefangen. –

Verwandte Themen