Ein Scala-Array ist eine sequenzielle Abfolge von Objekten gleichen
Typs. So ist zum Beispiel ein Array[Int]
eine Folge
von Objekten des Typs Int
. Die Länge eines Scala-Arrays
wird bei dessen Initialisierung festgelegt und kann nachträglich nicht
verändert werden.
Die einzelnen Elemente eines Arrays können jedoch ausgetauscht werden, was dazu führt,
dass ein Scala-Array ein veränderlicher Datentyp ist.
Das nachfolgende Beispiel zeigt die Initialisierung eines Array
für Elemente des Typs Int
, mit Platz für drei Elemente.
Nach der Initialisierung des Array
werden Int
Elemente
dem Array
zugeordnet. Das Beispiel zeigt auch, dass der Zugriff
auf Array
- Elemente 0 basierend ist (das erste Element eines Arrays
hat den Index 0).
var myInts = new Array[Int](3) myInts(0) = 3 myInts(1) = 1 myInts(2) = 2
Dieses Array lässt sich auch in kürzerer Weise erzeugen, was nachfolgendes Beispiel zeigt. Beide Quelltextvarianten erzeugen identische Arrays.
var myInts = Array[Int](3,2,1)
Scala ist in der Lage den Parametertyp aus den initialisierenden
Werten abzuleiten. Daher kann die Angabe des Typs [Int]
auch weggelassen werden:
var myInts = Array(3,2,1)
Die allgemeine Form des Zugriffs auf die Elemente eines Arrays hat folgende Form:
myInts.apply(1)
Dieser Zugriff kann auch in der Kurzschreibweise erfolgen:
myInts(1)
Auffällig ist, dass in Scala runde statt die aus Java gewöhnten
eckigen Klammern verwendet werden. Dies liegt einfach darin, dass auch
wenn man myInts(1)
verwendet, der Compiler dies in
myInts.apply(1)
übersetzt. Der Zugriff auf ein
Element eines Arrays ist somit ein gewöhnlicher Methodenaufruf.
Die Möglichkeiten direkt über den Konstruktor mehrdimensionale Arrays in Scala zu erzeugen funktioniert
seit Scala 2.10 nicht mehr
(val myMulArray = new Array[Array[Double]](2,3)
).
Auf multidimensionale Arrays brauchen wir dennoch nicht zu verzichten.
Das Companion Objekt von Array bietet uns mehrere Factory-Methoden Array.ofDim[T](...)
zur Erzeugung von mehrdimensionalen Arrays mit bis zu 5 Dimensionen an.
Das nachfolgende Beispiel zeigt die Erzeugung und Verwendung eines 2-dimensionalen Arrays mit Hilfe einer Factory - Methode.
object MultiArray { def main(args: Array[String]) { val myMulArray = Array.ofDim[Double](2,3) myMulArray(0)(0) = 1.0 myMulArray(0)(1) = 2.0 myMulArray(0)(2) = 3.0 myMulArray(1)(0) = 4.0 myMulArray(1)(1) = 5.0 myMulArray(1)(2) = 6.0 println(myMulArray(1)(2)) myMulArray.foreach(_.foreach(println(_))) } }
Die Ausführung des Programms führt zu folgender Ausgabe auf der Systemausgabe:
6.0 1.0 2.0 3.0 4.0 5.0 6.0
Eine weitere Möglichkeit ein mehrdimensionales Array zu erzeugen besteht darin die einzelnen Ebenen des Arrays einzeln zu konstruieren und diesen dann die "Datenarrays" zuzuweisen.
Im nachfolgenden Beispiel erzeugen wir auf diese Weise ein 2 - dimensionales Array mit Double
-
Werten, wobei das entstehende 2 -dimensionale Array eine Dreiecksform aufweist.
object ArrayArray { def main(args: Array[String]): Unit = { // creation val dim2 = new Array[Array[Int]](5) for (i <- 0 until dim2.length) { dim2(i) = new Array[Int](i+1) for (j <- 0 until dim2(i).length) dim2(i)(j) = i + j } // output for (i <- 0 until dim2.length) { for (j <- 0 until dim2(i).length) print(dim2(i)(j)) println } } }
Die Ausführung des Programms führt zu folgender Ausgabe auf der Systemausgabe:
0 12 234 3456 45678