Programmiertechnik
Felder (Arrays)
Prof. Dr. Oliver Haase
Oliver Haase Hochschule Konstanz 2
Exkurs – Code-Formatierung
Gute Code-Formatierung
ist das erste und einfachste Mittel, den Programmcode lesbarer (und damit besser wartbar) zu machen;
spiegelt die logische Struktur des Programms im Layout wider;
basiert im wesentlich auf guter Einrückung.
Exkurs – Code-Formatierung
Gleichwertige Anweisungen
Anweisungen, die auf derselben logischen Ebene stehen, d.h.
Sequenzen von Anweisungen, stehen direkt untereinander:
int i = 3;
String s = "hallo, welt.";
double prozentSatz;
falsch:
richtig:
int i = 3;
String s = "hallo, welt.";
Oliver Haase Hochschule Konstanz 4
Exkurs – Code-Formatierung
Immer nur 1 Befehl pro Zeile! (sonst stünden auch gleichwertige Anweisungen nicht untereinander wie gefordert.)
int a = i; i++;
falsch:
richtig:
int a = i;
i++;
Exkurs – Code-Formatierung
Tieferstehende Anweisungen
Anweisungen, die auf der nächst tieferen logischen Ebene stehen, werden um 1 Einheit eingerückt. Das können 2, 3 oder 4 Leerzeichen, oder ein Tabulatoreinrückung sein. Wichtig: konsistent einrücken!
Die nächst tiefere Ebene wird eingeleitet durch:
eine Klassendeklaration
eine Methodendeklaration
eine If-Anweisung
eine Switch-Anweisung
eine Schleife
Oliver Haase Hochschule Konstanz 6
Exkurs – Code-Formatierung
Klassendeklaration
Die Klassendeklaration steht eine Ebene höher als die Klassenkomponenten:
public class MyClass {
public static void main(String[] args) { …}
falsch:
richtig:
public class MyClass {
public static void main(String[] args) { …}
Exkurs – Code-Formatierung
Methodendeklaration (bisher nur main )
Die Signatur steht eine Ebene höher als der Methodenrumpf:
deshalb z.B.:
public class MyClass {
public static void main(String[] args) { System.out.println(“Hallo Welt");
}}
Oliver Haase Hochschule Konstanz 8
Exkurs – Code-Formatierung
if-Anweisung
Die Bedingung und das Schlüsselwort else stehen eine Ebene höher als die Anweisungen:
if ( i == 1 )
System.out.println("OK");
else i++;
falsch:
richtig:
if ( i == 1 )
System.out.println("OK");
else i++;
Exkurs – Code-Formatierung
noch besser:
if ( i == 1 ) {
System.out.println("OK");
}else { i++;
}
Oliver Haase Hochschule Konstanz 10
Exkurs – Code-Formatierung
Switch-Anweisung
Das Schlüsselwort switch steht eine Ebene höher als das
Schlüsselwort case , das wiederum eine Ebene höher steht als die Anweisungen:
switch ( i ) { case 1:
System.out.println("i ist 1");
break;
case 2:
System.out.println("i ist 2");
break;
default:
System.out.println("Defaultfall");
}
Exkurs – Code-Formatierung
Schleifen
Der Schleifenkopf steht eine Ebene höher als der Schleifenrumpf:
For-Schleife:
for ( int i = 0; i < 10; i++ ) System.out.println(i);
for ( int i = 0; i < 10; i++ ){
System.out.println(i);
System.out.println(2 * i);
} und
Oliver Haase Hochschule Konstanz 12
Exkurs – Code-Formatierung
While-Schleife:
while ( i < 10 )
System.out.println(i++);
while ( i < 10 ) {
System.out.println(i);
i++;
} und
Exkurs – Code-Formatierung
Do-Schleife:
do System.out.println(i++);
while ( i < 10 );
do { System.out.println(i);
i++;
} while ( i < 10 );
und
Oliver Haase Hochschule Konstanz 14
Exkurs – Code-Formatierung
Klammerungsregel
Sich öffnende geschweifte Klammern stehen am Ende des
vorangehenden Befehls, sich schließende Klammern in einer
eigenen Zeile. Letztere werden so eingerückt, dass sie mit dem
Beginn der Zeile übereinstimmen, in der die zugehörige offene
Klammer steht. Außer bei Do-Schleifen darf in dieser Zeile kein
weiterer Befehl stehen.
Exkurs – Code-Formatierung
Beispiel:
public class MyClass {
public static void main(String[] args) { int i = 0;
while ( i < 10 ) { if ( i%3 == 0 ) {
System.out.println("Dreierzahl: " + i);
}
else {
System.out.println("keine Dreierzahl");
} i++;
} }
Oliver Haase Hochschule Konstanz 16
Exkurs-Ende
Felder (Arrays)
- diesmal wirklich -
Was sind Referenzdatentypen?
In Java gibt es 2 Arten von Datentypen:
skalare Typen (Basistypen, einfache Datentypen):
byte
short
int
long
float
double
char
boolean
Referenzdatentypen
Oliver Haase Hochschule Konstanz 18
Was sind Referenzdatentypen?
Referenzdatentypen erlauben es, aus vorhandenen Typen neue, komplexere, eigene Typen zu konstruieren
Java kennt 2 Arten von Referenzdatentypen:
Felder (Arrays)
Klassen
Variablen eines Referenzdatentyps sind keine direkten Werte,
sondern Referenzen, d.h. sie verweisen nur auf die eigentlichen
Werte.
Speicherschema
…
94: 107
… 123
…
101:
123:
Hauptspeicher Speicher-
adressen Variablen
b r
Datentyp
Ganzzahl
Referenz (Adresse, Verweis)
Situation:
Ganzzahl-Variable b mit Wert 107, gespeichert in Zelle 94
Referenzvariable r , gespeichert in Zelle 101, verweist auf Zelle 123
Oliver Haase Hochschule Konstanz 20
graphische Darstellung
graphische Darstellung:
Variable als Kästchen mit Variablennamen, ohne Speicheradresse
Kästcheninhalt:
für skalare Typen: Wert
für Referenzen: Pfeil auf anderes (Speicher-)Kästchen:
b 107 r
zwei Referenzen r und s sind gleich, wenn sie auf denselben Speicher verweisen:
r s
Kalenderprogramm
Aufgabe: Kalenderprogramm zur Verwaltung von Terminen
Vereinfachung: Nur ein Wochentag (Montag)
Mittagessen mit Kalle Aufgaben bearbeiten
Sport
dösen der Wecker klingelt
aufstehen
Vorlesung schwänzen 00:00
01:00 02:00 03:00 04:00 05:00 06:00 07:00 08:00 09:00 10:00 11:00
12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 20:00 21:00 22:00 23:00
Montag
Oliver Haase Hochschule Konstanz 22
Kalenderprogramm
Erste, umständliche, Realisierung (Warnung: 7 Seiten Programm!)
public class UmstaendlicherKalender {
public static void main(String[] args) { java.util.Scanner scanner =
new Java.util.Scanner(System.in);
// fuer jede Stunde eine Variable String termin_00 = "";
String termin_01 = "";
String termin_02 = "";
String termin_03 = "";
String termin_04 = "";
String termin_05 = "";
String termin_06 = "";
String termin_07 = "";
Kalenderprogramm
String termin_08 = "";
String termin_09 = "";
String termin_10 = "";
String termin_11 = "";
String termin_12 = "";
String termin_13 = "";
String termin_14 = "";
String termin_15 = "";
String termin_16 = "";
String termin_17 = "";
String termin_18 = "";
String termin_19 = "";
String termin_20 = "";
String termin_21 = "";
String termin_22 = "";
String termin_23 = "";
Oliver Haase Hochschule Konstanz 24
Kalenderprogramm
// die Hauptschleife boolean fertig = false;
while (!fertig) {
// zuerst ein Auswahlmenue
System.out.print("1 = neuer Eintrag\n" + "2 = Termine ausgeben\n" + "3 = beenden");
int auswahl = scanner.nextInt();
// nun eine Fallunterscheidung switch (auswahl) {
case 1: // neuen Termin eingeben System.out.print("Wieviel Uhr?");
int stunde = scanner.nextInt();
System.out.print("Termin?");
String termin = scanner.next();
Kalenderprogramm
switch (stunde) {
case 0: termin_00 = termin; break;
case 1: termin_01 = termin; break;
case 2: termin_02 = termin; break;
case 3: termin_03 = termin; break;
case 4: termin_04 = termin; break;
case 5: termin_05 = termin; break;
case 6: termin_06 = termin; break;
case 7: termin_07 = termin; break;
case 8: termin_08 = termin; break;
case 9: termin_09 = termin; break;
case 10: termin_10 = termin; break;
case 11: termin_11 = termin; break;
case 12: termin_12 = termin; break;
case 13: termin_13 = termin; break;
Oliver Haase Hochschule Konstanz 26
Kalenderprogramm
case 14: termin_14 = termin; break;
case 15: termin_15 = termin; break;
case 16: termin_16 = termin; break;
case 17: termin_17 = termin; break;
case 18: termin_18 = termin; break;
case 19: termin_19 = termin; break;
case 20: termin_20 = termin; break;
case 21: termin_21 = termin; break;
case 22: termin_22 = termin; break;
case 23: termin_23 = termin; break;
}
break;
Kalenderprogramm
case 2: // Termine ausgeben
System.out.println(" 0h: " + termin_00);
System.out.println(" 1h: " + termin_01);
System.out.println(" 2h: " + termin_02);
System.out.println(" 3h: " + termin_03);
System.out.println(" 4h: " + termin_04);
System.out.println(" 5h: " + termin_05);
System.out.println(" 6h: " + termin_06);
System.out.println(" 7h: " + termin_07);
System.out.println(" 8h: " + termin_08);
System.out.println(" 9h: " + termin_09);
System.out.println("10h: " + termin_10);
System.out.println("11h: " + termin_11);
System.out.println("12h: " + termin_12);
System.out.println("13h: " + termin_13);
System.out.println("14h: " + termin_14);
Oliver Haase Hochschule Konstanz 28
Kalenderprogramm
System.out.println("16h: " + termin_16);
System.out.println("17h: " + termin_17);
System.out.println("18h: " + termin_18);
System.out.println("19h: " + termin_19);
System.out.println("20h: " + termin_20);
System.out.println("21h: " + termin_21);
System.out.println("22h: " + termin_22);
System.out.println("23h: " + termin_23);
System.out.println("---");
break;
case 3:
fertig = true;
break;
default: // falsche Zahl eingegeben
System.out.println("Eingabefehler!");
} } }}
Analyse
Kalenderprogramm hat eine Länge von ca. 100 Zeilen
Davon 72 Zeilen für Verwaltung der Termineinträge:
24 Zeilen für Variablendeklaration
24 Zeilen für Fallunterscheidung bei Termineingabe
24 Zeilen für Ausgabe´der einzelnen Zeiten
Kalender für ganzes Jahr: 365 · 72 = 26280 Zeilen nur für Termineintragsverwaltung!
Beobachtung: alle 24 Terminvariablen haben
denselben Typ (String)
denselben Namen bis auf einen Index zwischen 00 und 23.
Oliver Haase Hochschule Konstanz 30
Felder
Felder (engl: Arrays) erlauben, mehrere Variablen desselben Typs unter demselben Namen zusammenzufassen, und durch einen Index voneinander zu unterscheiden, etwa
termine[0], termine[1], …, termine[23] .
Einzelnen Variablen eines Feldes heißen Komponenten.
Index ist vom Typ int , es sind aber nur positive Werte erlaubt.
Die erste Komponente eines Feldes hat immer den Index 0.
Der Index einer Komponente beschreibt deren Position innerhalb des Feldes.
Ein Feld kann auch als eindimensionale Tabelle aufgefasst werden.
Felder
Beispiel: Feld termine für vereinfachtes Kalender- Programm:
Mittagessen mit Kalle Aufgaben bearbeiten
Sport
1213 14 15 16 17 18 19 20 21 der Wecker klingelt
Aufstehen
Vorlesung schwänzen 0 1 2 3 4 5 6 7 8 9 10 11
termine termine[0]
termine[6]
termine[14]
. . .
. . .
. . .
Oliver Haase Hochschule Konstanz 32
Felder
Beispiel: Ausgabe des 6 Uhr Termins:
erzeugt die Bildschirmausgabe:
Beispiel: Ausgabe aller Termine:
Merke: die obige Verwendung einer Schleifenvariable als Index für ein Feld ist eine sehr häufige Programmiertechnik!
System.out.println("6h: " + termine[6]);
6h: der Wecker klingelt
Konsole
for ( int i = 0; i < 24; i++ ) {
System.out.println(i + "h: " + termine[i]);
}
Felddeklaration
erzeugt eine Referenzvariable mit Namen <VariablenName> , die auf ein Feld mit Komponententyp <Komponententyp> verweist.
Merke: Die Felddeklaration erzeugt nicht das eigentliche Feld, nur eine Referenz auf ein Feld!
Aus Kompatibilitätsgründen mit C/C++ können die Klammern auch nach dem Variablennamen stehen wird hier nicht verwendet.
<Komponententyp> [] <VariablenName>;
Syntaxregel
Oliver Haase Hochschule Konstanz 34
Felddeklaration
Die Zeilen
int[] feld1;
double[] feld2;
String[] feld3;
int[] feld4;
erzeugen 4 Referenzvariablen, aber noch keine eigentlichen Felder. Zu diesem Zeitpunkt ist noch nicht einmal festgelegt, wieviele Komponenten die Felder einmal haben sollen.
Ein Komponentenzugriff, etwa feld1[0] , ist zu diesem Zeitpunkt noch nicht möglich ( Kompilierfehler)!
feld1
Felderzeugung
Beispiel: Die Zeilen
<VariablenName> = new <KomponentenTyp>[<Feldlaenge>];
Syntaxregel
feld1 = new int[4];
feld2 = new double[2];
feld3 = new String[4];
feld4 = new int[5];
erzeugen 4 Felder der geeigneten Typen und setzen die Referenzen entsprechend.
feld1
0 1 2 3
Oliver Haase Hochschule Konstanz 36
Feldinitialisierung
Die einzelnen Komponenten eines Feldes können durch einfache Wertzuweisungen initialisiert werden:
<VariablenName>[<Index>] = <Wert>;
Syntaxregel
Bei regelmäßigen Werten geschieht dies meistens in einer Schleife:
for ( int i = 0; i < 4; i++ ) { feld1[i] = 2 * i + 1;
}
feld1 1 3 5 7
0 1 2 3
Feldinitialisierung
Alternativ kann ein Feld gleichzeitig deklariert, erzeugt und initialisiert werden:
der Klammerausdruck heißt Feldinitialisierer.
Hierbei ergibt sich die Feldlänge automatisch aus der Anzahl der Startwerte.
Diese Schreibweise ist vor allem geeignet für Felder,
die nicht zu lang sind;
deren Komponenten keinen regelmäßigen Gesetzmäßigkeiten folgen.
int[] feld1 = {1, 6, 4, 7};
double[] feld2 = {3.14, -276.06};
String[] feld3 = {"Hallo", "dies", "ist ein", "Feld"};
Oliver Haase Hochschule Konstanz 38
Kalenderprogramm
Vereinfachte Realisierung mit Feldern:
public class EinfacherKalender {
public static void main(String[] args) { java.util.Scanner scanner =
new Java.util.Scanner(System.in);
// ein Feld fuer den ganzen Tag String[] termine = new String[24];
for ( int i = 0; i < 24; i++ ) { termine[i] = "";
}
Kalenderprogramm
Vereinfachte Realisierung mit Feldern:
// die Hauptschleife boolean fertig = false;
while (!fertig) {
// zuerst ein Auswahlmenue
System.out.print("1 = neuer Eintrag\n" + "2 = Termine ausgeben\n" + "3 = beenden");
int auswahl = scanner.nextInt();
switch (auswahl) {
case 1: // neuen Termin eingeben System.out.print("Wieviel Uhr?");
int stunde = scanner.nextInt();
System.out.print("Termin?");
termin[stunde] = scanner.next();
Oliver Haase Hochschule Konstanz 40
Kalenderprogramm
case 2: // Termine ausgeben
for ( int i = 0; i < 24; i++ ) {
System.out.println(i + "h: " + termine[i]);
}
System.out.println("---");
break;
case 3:
fertig = true;
break;
default: // falsche Zahl eingegeben
System.out.println("Eingabefehler!");
} } }}
Programmlänge reduziert von ca. 100 auf 35 Zeilen!
Feldlänge
Felder kennen ihre eigene Länge.
String[] feld = {"Hallo", "dies", "ist ein", "Feld"};
for ( int i = 0; i < feld.length; i++ ) {
<VariablenName>.length
Syntaxregel
Das ist praktisch z.B. wenn
die Länge erst zur Laufzeit vom Benutzer eingegeben wird;
eine Feld mit Hilfe eines Feldinitialisierers deklariert und initialisiert wird;
ein Feld als Parameter in eine Methode übergeben wird.
Beispiel:
Oliver Haase Hochschule Konstanz 42
Feldlänge
Es ist guter, defensiver Programmierstil, die Feldlänge abzufragen anstatt sie direkt zu verwenden.
Beispiel: Welches der folgenden Programme ist besser? Warum?
String[] feld = {"Hallo", "dies", "ist ein", "Feld"};
for ( int i = 0; i < feld.length; i++ ) { System.out.println(feld[i]);
}
oder
String[] feld = {"Hallo", "dies", "ist ein", "Feld"};
for ( int i = 0; i < 4; i++ ) { System.out.println(feld[i]);
}
Referenzzuweisungen
Betrachte folgendes einfaches Programmfragment:
System.out.print("Zahl: ");
int wert = scanner.nextInt();
// kopiere wert in eine neue Variable int wert2 = wert;
// verdopple die neue Variable wert2 *= 2;
// Ausgabe
System.out.println("Die Zahl " + wert +
" ergibt verdoppelt " + wert2);
Zahl: 17
Die Zahl 17 ergibt verdoppelt 34 Konsole
Oliver Haase Hochschule Konstanz 44
Referenzzuweisungen
Erweiterte Version für ein Zahlenfeld:
int[] werte = new int[3];
for ( int i = 0; i < werte.length; i++ ) { System.out.print("Zahl Nr. " + i + ": ");
werte[i] = scanner.nextInt();
}// kopiere Feld und verdopple die Eintraege int[] werte2 = werte;
for ( int i = 0; i < werte2.length; i++ ) { werte2[i] *= 2;
}// Ausgabe
for ( int i = 0; i < werte.length; i++ ) { System.out.println("Die Zahl " + werte[i]
+ " ergibt verdoppelt " + werte2[i]);
}
Referenzzuweisungen
Ausführen des erweiterten Programms:
Zahl Nr. 0: 1 Zahl Nr. 1: 2 Zahl Nr. 2: 3
Die Zahl 2 ergibt verdoppelt 2 Die Zahl 4 ergibt verdoppelt 4 Die Zahl 6 ergibt verdoppelt 6
Konsole
Was ist da schiefgegangen?
Oliver Haase Hochschule Konstanz 46
Referenzzuweisungen
werte
0 1 2 int[] werte = new int[3];
werte2 = werte;
werte2
Graphische Speicherdarstellung
werte[0] = 1;
1
werte[1] = 2;
2
werte[2] = 3;
3
werte2[0] *= 2;
2
werte2[1] *= 2;
4
werte2[2] *= 2;
6
Nur die Referenzvariable wird kopiert, nicht das eigentliche Feld! Jede
Änderung an einer der beiden
Variablen ändert auch die andere!
Kopieren eines Feldes
Kopieren eines Feldes (nicht nur Referenzvariable) erfordert etwas Handarbeit:
Das neue Feld muss nicht nur deklariert, sondern auch erzeugt werden:
Die einzelnen Komponenten müssen vom alten in das neue Feld kopiert werden. Dazu gibt es 3 Möglichkeiten:
1. per Hand in einer Schleife
2. Verwendung der Java-Methode System.arraycopy
3. Verwendung der clone-Methode. Diese Option wird noch nicht int[] werte2 = new int[werte.length];
Oliver Haase Hochschule Konstanz 48
Kopieren eines Feldes
Kopieren der Feldkomponenten in einer Schleife:
for ( int i = 0; i < werte.length; i++ ) { werte2[i] = werte[i];
}
Kopieren eines Feldes
Verwendung der Java-Methode System.arraycopy :
System.arraycopy(werte, 0, werte2, 0, werte.length);
System.arraycopy(<Quelle>, <QuellStartIndex>,
<Ziel>, <ZielStartIndex>, <Anzahl>);
Syntaxregel
kopiert <Anzahl> Komponenten von Feld <Quelle> , beginnend bei Index <QuellStartIndex> nach Feld <Ziel> , beginnend mit Index <ZielStartIndex> .
Beispiel:
Oliver Haase Hochschule Konstanz 50
Vergleich von Referenzen
Was gibt das folgende Programm aus und warum?
int[] werte = {1, 2, 3};
int[] werte2 = new int[werte.length];
for ( int i = 0; i < werte.length; i++ ) { werte2[i] = werte[i];
}
if ( werte == werte2 ) {
System.out.println("Gleichheit");
}else {
System.out.println("Ungleichheit");
}
Vergleich von Referenzen
Ungleichheit
Konsole
Was verglichen wird, sind die Referenzen, und die sind unterschiedlich!
Oliver Haase Hochschule Konstanz 52
Mehrdimensionale Felder
Aufgabe: erweitere Kalenderprogramm so, dass Termine eines ganzen Monats (Januar) verwaltet werden.
00:00 01:00 02:00 03:00 04:00 05:00 06:00 07:00
...
21:00 22:00 23:00
Tag 1
... Tag 2
... Tag 31
…
…
…
Mehrdimensionale Felder
Lösung: Feld von Feldern mehrdimensionales Feld
genauer: Feld mit (31) Komponenten des Typs Feld mit (24) Komponenten des Typs String .
Deklaration: Verschachtelte Anwendung der Syntaxregel
<Komponententyp> [] <VariablenName>;
Syntaxregel
ergibt
<Feld mit Komponenten des Typs String>[] termine;
String[][] termine; erzeugt: termine
Oliver Haase Hochschule Konstanz 54
Mehrdimensionale Felder
2. Schritt Feld erzeugen:
erzeugt:
termine = new String[31][];
termine
termine[0] termine[1] … termine[30]
Merke: Die Länge des äußeren Felds wird im linken Klammernpaar
angegeben.
Mehrdimensionale Felder
3. Schritt Innere Felder erzeugen:
erzeugt:
for ( int i = 0; i < termine.length; i++ ) { termine[i] = new String[24];
for ( int j = 0; j < termine[i].length; j++ ) { termine[i][j] = "";
}}
termine
termine[0] termine[1] … termine[30]
termine[0][0]
termine[0][1]
termine[0][2]
…
Oliver Haase Hochschule Konstanz 56
Mehrdimensionale Felder
Zugriff auf mehrdimensionale Felder:
termine[i] bezeichnet die i-te Komponente des äußeren Felds, d.h. die i-te Spalte einer zweidimensionalen Tabelle. Diese
Komponente ist selbst ein Feld von 24 Strings.
termine[i].length gibt die Länge der i-ten Komponente (Spalte) an.
termine[i][j] bezeichnet den j-ten Eintrag in der i-ten Spalte.
Der Ausdruck
termine[1][7] = "Fruehstueck";
weist dem 7h Termin am Tag 2 den Eintrag "Fruehstueck" zu.
Kalenderprogramm
Erweiterte Version für einen ganzen Monat:
public class ErweiterterKalender {
public static void main(String[] args) { java.util.Scanner scanner =
new Java.util.Scanner(System.in);
int tag;
// ein Feld fuer den ganzen Monat
String[][] termine = new String[31][];
for ( int i = 0; i < termine.length; i++ ) { termine[i] = new String[24];
for ( int j = 0; j < termine[i].length; j++ ) { termine[i][j] = "";
Oliver Haase Hochschule Konstanz 58
Kalenderprogramm
// die Hauptschleife boolean fertig = false;
while (!fertig) {
// zuerst ein Auswahlmenue
System.out.print("1 = neuer Eintrag\n" + "2 = Termine ausgeben\n" + "3 = beenden");
int auswahl = scanner.nextInt();
Kalenderprogramm
// nun eine Fallunterscheidung switch (auswahl) {
case 1: // neuen Termin eingeben System.out.print("Welcher Tag?");
tag = scanner.nextInt();
System.out.print("Wieviel Uhr?");
int stunde = scanner.nextInt();
System.out.print("Termin?");
termin[tag -1][stunde] = scanner.next();
break;
Oliver Haase Hochschule Konstanz 60
Kalenderprogramm
case 2: // Termine ausgeben
System.out.print("Welcher Tag?");
tag = scanner.nextInt();
for (int i = 0; i<termine[tag-1].length; i++) { System.out.println(i + "h: "
+ termine[tag-1][i]);
}
System.out.println("---");
break;
case 3:
fertig = true;
break;
default: // falsche Zahl eingegeben
System.out.println("Eingabefehler!");
} } }}
Mehrdimensionale Felder
Vereinfachte Deklaration
Anstelle von
kann auch die folgende Kurzschreibweise verwendet werden:
int[][] table;
table = new int[2][];
for ( int i = 0; i < table.length; i++ ) { table[i] = new int[3];
}
int[][] table = new int[2][3];
Merke: Das funktioniert nur wenn alle inneren Felder dieselbe Länge
Oliver Haase Hochschule Konstanz 62
Kopieren mehrdimensionaler Felder
Aufgabe: Kopiere zweidimensionales Feld int[][] table in ein neues zweidimensionales Feld int[][] newTable .
1. Lösungsversuch:
int[][] newTable = new int[2][3];
newTable = table;
1. Zeile legt neues zweidimensionales Feld an, aber
nach 2. Zeile verweist Referenzvariable newTable auf dasselbe Feld wie Referenzvariable table.
führt keine Feldkopie durch!
Kopieren mehrdimensionaler Felder
2. Lösungsversuch:
int[][] newTable = new int[2][3];
for ( int i = 0; i < newTable.length; i++ ) { newTable[i] = table[i];
}
1. Zeile legt neues zweidimensionales Feld an, aber
nach Schleife verweisen alle inneren Referenzvariablen auf die Spalten in der alten Tabelle table.
führt nur flache Kopie durch; nicht ausreichend!
Oliver Haase Hochschule Konstanz 64
Kopieren mehrdimensionaler Felder
3. Lösungsversuch:
int[][] newTable = new int[2][3];
for ( int i = 0; i < newTable.length; i++ ) {
for ( int j = 0; j < newTable[i].length; j++ ) { newTable[i][j] = table[i][j];
}}
führt gewünschte "tiefe Kopie" durch!