Programmierkurs Birgit Engels, Anna Schulze ZAIK Universität zu Köln WS 07/08 Kapitel 6 Felder (Arrays) Mehrdimensionale Arrays 6.0 Felder (Arrays) Bisher haben wir einzelne Variablen primitiver Datentypen benutzt. Manchmal benötigt man aber mehrere Variablen des gleichen Typs. Dazu kann man sogenannte Felder (Arrays) dieses Typs nutzen: Ein Feld besteht aus mehreren Variablen des gleichen Typs. Der gewünschte Typ wird bei der Deklaration angegeben und ist im Feld homogen. Ein Feld besitzt einen anderen Datentyp als seine Einträge. Der Datentyp eines Feldes von Variablen des Typs typ ist typ[] (“Typ-Array”). Deklaration von Feldern Deklaration ohne Initialisierung: < Datentyp > < Name > [] = new < Datentyp >[< n >]; oder Deklaration mit Initialisierung: < Datentyp > < Name > [] = {< Wert1 >, ..., < Wertn >}; n: Länge des Feldes bzw. Anzahl der Einträge. Beispiele für Deklaration von Feldern int intArray[] = new int[10]; double doubleArray[] = {1.5, 3.12, 7.85}; int tore[] = new int[34]; Im ersten und dritten Fall sind die Array-Variablen noch nicht initialisiert! Zugriff ist daher erst nach Zuweisung eines Wertes sinnvoll (s.u.). Zugriff und Zuweisungen Zugriff auf einen einzelnen Eintrag im Feld, erhält man mit dem []-Operator über einen Index 0 ≤ i < n. Beispiel: < Name >[i] Ein solcher Eintrag verhält sich wie eine Variable vom Typ < Datentyp >. Daher sind folgende Zuweisungen möglich: tore[1]=2; int t=tore[1]; Der Array-Index Der Index eines Arrays muss vom Typ int sein. (Eine rationaler oder anderer ganzzahliger Datentyp ist nicht zugelassen, auch wenn die entsprechende Variable ganzzahligen Wert hat.) Der Index i kann Werte zwischen 0 und n − 1 annehmen. Bei anderen Werten kommt es zu einer Ausnahme (später). Die Einträge eines Arrays sind von 0 (!) bis n − 1 (!) durchnummeriert. (Das sind genau n Eintrge.) Die Länge des Arrays (also auch Name.length) entspricht der Anzahl der Einträge n, nicht der Nummer des letzten Eintrags n − 1. Beispiel Arrays (ArrayEx.java) 1. public static void main(String[] args) 2. { 3. int tore[] = new int[34]; 4. int toreges=0; 5. for (int i=0; i<tore.length; i++) 6. tore[i]=i%4 ; 7. for (int i=0; i<tore.length; i++) 8. toreges+=tore[i] ; 9. System.out.println( ‘‘Tore: ’’ + toreges); 10. } 49 Beispiel Arrays (ArrayEx.java) 1. public static void main(String[] args) 2. { 3. int tore[] = new int[34]; Initialisierung von tore mittels for4. int toreges=0; Schleife. 5. for (int i=0; i<tore.length; i++) 6. tore[i]=i%4 ; 7. for (int i=0; i<tore.length; i++) 8. toreges+=tore[i] ; 9. System.out.println( ‘‘Tore: ’’ + toreges); 10. } 49 Beispiel Arrays (ArrayEx.java) 1. public static void main(String[] args) 2. { über for-Schleife: Summierung 3. int tore[] = new int[34]; toreges+=tore[i] müsste mit 4. int toreges=0; einzelnen int-Variablen 34 Mal (!) 5. for (int i=0; i<tore.length; als explizitei++) Anweisung auftauchen. 6. tore[i]=i%4 ; 7. for (int i=0; i<tore.length; i++) 8. toreges+=tore[i] ; 9. System.out.println( ‘‘Tore: ’’ + toreges); 10. } 49 Länge eines Arrays Die Länge eines Arrays kann abgefragt werden mit < Name >.length, Beispiel: int n=tore.length; Wie schon bei Methoden, taucht wieder die Punktnotation als Zugriffsoperator auf. Es fehlen allerdings Klammern am Schluss, da nicht auf eine Methode, sondern auf eine Variable zugegriffen wird, die im Array automatisch zusätzlich zu den Einträgen gespeichert ist. Das Array ist offenbar selbst kein primitiver Datentyp, auch wenn seine Einträge solche sein können (nicht müssen). Arrays haben feste Länge Die Länge eines Arrays kann nur einmal bei der Deklaration festgelegt werden. Diese Festlegung kann durch eine int-Variable erfolgen. Spätestens zur Abarbeitungszeit der Deklaration (im laufenden Programm), muss der Wert der Variablen feststehen. Dies kann ein Nachteil sein, da zur Zeit der Deklaration die benötigte Länge nicht immer fest steht (Beispiel: Dateneinlesen aus Datei, später). Abhilfe bei variablem Längenbedarf Steht die benötigte Länge eines Arrays bei der Deklaration nicht fest, kann man das Array einfach “gross genug” wählen. Diese Methode ist nur bei kleinen Programmen und kleinen Datenmengen empfehlenswert, da Dennoch unerwartet grosse Datenmengen auftreten können. Bei kleineren Datenmengen immer zu viel Speicher reserviert wird. Eventuell nicht mehr gültige Daten noch auf unbenutzten Array-Plätzen residieren. Andere Möglichkeiten bieten weitere vordefinierte Datentypen in Java, z.B. Vector, Hashtable (später). 6.1 Mehrdimensionale Arrays Ein Array umfasst eine Reihe von Variablen gleichen Typs < Typ >. Ein Array ist dabei selber eine Variable vom Typ < Typ > []. Ein Array kann also selbst wieder Arrays enthalten: Typ < Name >[][] = new Typ[n][m] oder Typ < Name >[][] = { {Wert11, Wert12, ... ,Wert1m} {Wert21, Wert22, ... ,Wert2m} ... {Wertn1, Wert12, ... ,Wertnm} } Beispiel Mehrdimensionale Arrays (MoreArray.java) 1. public static void main(String[] args) 2. { 3. double matrix[][] = {{0.5, 0.0},{0.5, 0.0}}; 4. double vektor[] = {2.0,2.0}; 5. double evektor[] = new double[2] ; 6. evektor[0]=0 ; 7. evektor[1]=0 ; 8. for (int i=0; i<matrix.length; i++) 9. for(int j=0; j<matrix[i].length; j++) 10. evektor[i]+=(matrix[i][j])*vektor[j] ; 11. System.out.println(‘‘Vektor: (’’+ evektor[0]+‘‘,’’+evektor[1]+‘‘)’’); 12. } Vektor: (1.0,1.0) Beispiel Mehrdimensionale Arrays (MoreArray.java) 1. public static void main(String[] args) 2. { 3. double matrix[][] = {{0.5, 0.0},{0.5, 0.0}}; 4. double vektor[] = {2.0,2.0}; 5. double evektor[] = new double[2] ; Deklaration und Initialisierung eines 6. evektor[0]=0 ; 2-dim. Arrays (Hier Nutzung als Ma7. evektor[1]=0 ; trix). 8. for (int i=0; i<matrix.length; i++) 9. for(int j=0; j<matrix[i].length; j++) 10. evektor[i]+=(matrix[i][j])*vektor[j] ; 11. System.out.println(‘‘Vektor: (’’+ evektor[0]+‘‘,’’+evektor[1]+‘‘)’’); 12. } Vektor: (1.0,1.0) Beispiel Mehrdimensionale Arrays (MoreArray.java) 1. public static void main(String[] args) 2. { 3. double matrix[][] = {{0.5, 0.0},{0.5, 0.0}}; 4. double vektor[] = {2.0,2.0}; 5. double evektor[] = new double[2] ; 6. evektor[0]=0 ; 7. evektor[1]=0 ; 8. for (int i=0; i<matrix.length; i++) 9. for(int j=0; j<matrix[i].length; j++) 10. evektor[i]+=(matrix[i][j])*vektor[j] ; 1-dim. Beide Deklarationsarten eines 11. System.out.println(‘‘Vektor: (’’+ Arrays (Hier als Vektor) und entspreevektor[0]+‘‘,’’+evektor[1]+‘‘)’’); chende Initialisierung. 12. } Vektor: (1.0,1.0) Beispiel Mehrdimensionale Arrays (MoreArray.java) 1. public static void main(String[] args) 2. { 3. double matrix[][] = {{0.5, 0.0},{0.5, 0.0}}; 4. double vektor[] = {2.0,2.0}; 5. double evektor[] = new double[2] ; 6. evektor[0]=0 ; 7. evektor[1]=0 ; 8. for (int i=0; i<matrix.length; i++) 9. for(int j=0; j<matrix[i].length; j++) 10. evektor[i]+=(matrix[i][j])*vektor[j] ; 11. System.out.println(‘‘Vektor: (’’+ evektor[0]+‘‘,’’+evektor[1]+‘‘)’’); 12. } Vektor: (1.0,1.0) Zugriff auf die Länge des Arrays (Zeilenanzahl der Matrix) Beispiel Mehrdimensionale Arrays (MoreArray.java) 1. public static void main(String[] args) 2. { 3. double matrix[][] = {{0.5, 0.0},{0.5, 0.0}}; 4. double vektor[] = {2.0,2.0}; 5. double evektor[] = new double[2] ; 6. evektor[0]=0 ; 7. evektor[1]=0 ; 8. for (int i=0; i<matrix.length; i++) 9. for(int j=0; j<matrix[i].length; j++) 10. evektor[i]+=(matrix[i][j])*vektor[j] ; 11. System.out.println(‘‘Vektor: (’’+ evektor[0]+‘‘,’’+evektor[1]+‘‘)’’); 12. } Vektor: (1.0,1.0) Zugriff auf die Breite des Arrays (Spaltenanzahl der Matrix) Beispiel Mehrdimensionale Arrays (MoreArray.java) 1. public static void main(String[] args) 2. { 3. double matrix[][] = {{0.5, 0.0},{0.5, 0.0}}; 4. double vektor[] = {2.0,2.0}; 5. double evektor[] = new double[2] ; 6. evektor[0]=0 ; 7. evektor[1]=0 ; 8. for (int i=0; i<matrix.length; i++) 9. for(int j=0; j<matrix[i].length; j++) 10. evektor[i]+=(matrix[i][j])*vektor[j] ; 11. System.out.println(‘‘Vektor: (’’+ evektor[0]+‘‘,’’+evektor[1]+‘‘)’’); 12. } Vektor: (1.0,1.0) Berechnung einer Multiplikation. Matrix-Vektor- Mehrdimensionale Arrays Ein Array kann natürlich wiederum eine Reihe 2-dimensionale Arrays umfassen und damit selbst ein 3-dimensionales Array bilden, usw. Es können damit beliebig-dimensionale Arrays erzeugt werden. Deklaration und Zugriff setzen sich entsprechend fort.