Programmierung
Arrays
Michael Goedicke (Basis Volker Gruhn und Mathias Book)
© paluno
Arrays
▪ Auch Felder oder Reihung genannt
▪ Sammlung von Werten des gleichen Typs, wobei auf jeden Wert
über einen Index zugegriffen werden kann
012345
012345
012345
▪ Anmerkung: Uns begegnen später noch Listen und Collections, mit denen sich manches eleganter lösen lässt als mit Arrays
1
2
6
24
120
720
“may”
“the”
“force”
“be”
“with”
“you”
“may”
“the”
“force”
24
120
720
Programmierung – VE04 2
© paluno
Arrays – Instanziierung
▪ Deklaration
▪ Typ[] arrayname;
▪ Typ kann primitiver Datentyp oder Klasse sein int[] factorialNumbers;
String[] words;
▪ Instanziierung
▪ arrayname = new Typ[Größe];
factorialNumbers = new int[6]; words = new String[6];
0 1 2 3 4 5 6
n-1
…
Programmierung – VE04
3
factorialNumbers: int[]
© paluno
Array – Zuweisung der Werte
▪ Instanziierung mit Initialisierung
▪ arrayname = {Wert0, Wert1, …, Wertn};
String[] words = {“may”, “the”, “force”, “be”, “with”, “you”};
▪ Zuweisung von Werten über einen Index ▪ Index beginnt bei 0!
int[] factorialNumbers = new int[6]; factorialNumbers[0] = 1; factorialNumbers[1] = 2; factorialNumbers[2] = 6; factorialNumbers[3] = 24; factorialNumbers[4] = 120; factorialNumbers[5] = 720;
Programmierung – VE04 4
© paluno
Arrays – Vergleich
▪ Das Schlüsselwort new beim Erzeugen eines Arrays deutet daraufhin, dass Arrays Objekte sind
▪ Die Operatoren == und != haben ihre Objekt-Bedeutung: Sie vergleichen lediglich, ob zwei Variablen auf das gleiche Array-Objekt
verweisen, aber vergleichen auf keinen Fall die Inhalte der Arrays!
(Dafür gibt es Arrays.equals(…) in der Java-Klassenbibliothek)
Quelle: Ullenboom, C, Java ist auch eine Insel, Galileo OpenBook, http://openbook.galileodesign.de/javainsel5/
int[] factorialNumbers = new int[6]; int[] numbersFactorial = new int[6]; // Arrays mit gleichen Werten füllen … factorialNumbers[0] = 1; numbersFactorial[0] = 1;
…
if (factorialNumbers == numbersFactorial){
// irgendwas machen } else {
// was anderes machen
}
else-Zweig wird immer ausgeführt
Programmierung – VE04 5
© paluno
Arrays – Zugriff
1
2
6
24
120
720
factorialNumbers words
012345
012345
“may”
“the”
“force”
“be”
“with”
“you”
▪ Zugriff auf bestimmtes Element ▪ arrayname[Index]
int x = factorialNumbers[2]; // x hat jetzt den Wert 6 String y = words[2]; // y hat jetzt den Wert “force“
▪ Die Nummerierung der Elemente beginnt immer bei 0 und ist immer positiv
▪ Zugriffe mit ungültigem Index erzeugen einen Fehler zur Laufzeit!
Programmierung – VE04 6
© paluno
Array – Länge
▪ Bestimmung der Länge ▪ arrayname.length
▪ Bei einem Array mit der Länge x ist der größte zulässige Index x-1
▪ Die Länge eines Arrays ist final, d. h. sie kann nicht geändert werden
▪ Arrays sind nicht dynamisch! Will man ein größeres Array haben so muss man ein neues Array erzeugen
int z = words.length; // z hat jetzt den Wert 6
1
2
6
24
120
720
012345
012345
“may”
“the”
“force”
“be”
“with”
“you”
Programmierung – VE04 7
© paluno
Mehrdimensionale Arrays
▪ Deklaration
• Zahl der Klammerpaare bestimmt Zahl der Dimensionen
• 2-dimensional: Typ[][] arrayname;
• 3-dimensional: Typ[][][] arrayname;
• usw.
• Instanziierung
• arrayname = new Typ[Größe0][Größe1];
int[][] factorialNumbers2dim = new int[2][6];
• Zugriff erfolgt über beide(!) Indizes
int x = factorialNumbers2dim[0][2] // x hat den Wert 6
1
2
6
24
120
720
720
120
24
6
2
1
0 1
012345
Programmierung – VE04 8
© paluno
Mehrdimensionale Arrays
▪ Java setzt mehrdimensionale Arrays als Array von Arrays um, d. h. eigentlich ist ein mehrdimensionales Array ein eindimensionales, welches weitere Arrays als Elemente besitzt
1
2
6
24
120
720
012345
720
120
24
6
2
1
012345
01
▪ Als Konsequenz folgt, dass mehrdimensionale Arrays nicht zwingend rechteckig sein müssen
1
2
6
24
120
720
012345
720
120
24
6
0123
01
Programmierung – VE04 9
© paluno
Mehrdimensionale Arrays
• Instanziierung nicht rechteckiger Arrays
• Größe einer Dimension abhängig vom Index der Oberdimension • arrayname = new Typ[Größe0][];
arrayname[Index0] = new Typ[GrößeIndex0]; • Instanziierung mit Initialisierung
• arrayname = new Typ[][] { {Wert00, Wert01, …, Wert0n}, {Wert10, Wert11, …, Wert1m}
};
int[][] factorialNumbers2dim = new int[][] { {1,2,4,24,120,720},
{720,120,24,6}
};
Programmierung – VE04 10
© paluno
Mehrdimensionale Arrays: Zugriff und Länge
• Referenz auf Gesamt-Array [n-dimensionales Array]
• arrayname
• Referenz auf Teil-Array an Position [Index0] des Gesamt-Array [ (n-1)-dimensionales Teil-Array ]
• arrayname[Index0]
• Referenz auf bestimmtes Feldelement • arrayname[Index0][Index1]
• Array-Länge der äußeren Dimension • arrayname.length
• Array-Länge der nächsttieferen Dimension • arrayname[Index0].length
Programmierung – VE04 11
© paluno
Arrays als Rückgabewert
▪ Methoden in Java haben immer genau einen Rückgabewert.
▪ Arrays bieten einen einfachen (und verführerischen) Mechanismus,
um mehrere Werte zurückzugeben
public int[] productAndSum( int a, int b ) { return new int[]{ a * b, a + b };
} Quelle: Ullenboom, C, Java ist auch eine Insel, Galileo OpenBook, http://openbook.galileodesign.de/javainsel5/
▪ Verführerisch: es können mehr als Wert zurückgegeben werden. Das ist unschöner Stil, falls der Zweck der verschiedenen Werte unterschiedlich ist
Programmierung – VE04 12
© paluno
Arrays als Parameter
▪ Als Parameter können Arrays verwendet werden, wenn man nicht genau weiß, wieviele Werte verarbeitet werden
▪ Beispiel: Berechnung des größten Wertes
public int max(int[] values){
// irgendwie das Maximum aller Werte berechnen return maximum;
}
▪ Um die Methode so zu verwenden, muss vorher ein Array aufgebaut werden
int[] values = new int[] {1,6,3,5,2}; int maxVal = max(values);
Basiert auf: Ullenboom, C, Java ist auch eine Insel, Galileo OpenBook, http://openbook.galileodesign.de/javainsel5/
Programmierung – VE04 13
© paluno
Arrays – Zusammenfassung
▪ Arrays werden auch Felder oder Reihung genannt und stellen eine Sammlung von Werten des gleichen Typs dar
▪ Auf jeden Wert im Array kann über einen Index zugegriffen werden
▪ Der höchste Index eines Arrays ist die Länge -1
▪ Arrays können beliebig viele Dimensionen haben
▪ Mehrdimensionale Arrays sind verschachtelte Arrays, d. h. eigentlich handelt es sich um gewöhnliche Arrays deren Elemente lediglich weitere Arrays sind
Programmierung – VE04 14
© paluno
Erweiterte for-Schleife
▪ Typischer Anwendungsfall: Für jeden Datensatz eine Aktion ausführen
Array mit Datensätzen
Anweisungen für jeden Datensatz ausführen
Programm fortsetzen
Programmierung – VE04 15
© paluno
Erweiterte for-Schleife
▪ Angenommen, wir möchten jeden String aus unserem Array ausgeben, so ist das mit der normalen Zählschleife möglich, aber umständlich
▪ Die Zählschleife zwingt uns, zusätzliche und ggf. unnötige Informationen anzugeben
▪ Zähler (auch Iterator genannt), der explizit initialisiert wird ▪ Eine Bedingung, bis wann gezählt werden soll
▪ Eine (manuelle!) Erhöhung des Zählers
▪ Die zusätzlichen Informationen beeinträchtigen die Lesbarkeit und sind fehleranfällig – was passiert, wenn im folgenden Beispiel der Wert von i in der Schleife manipuliert wird?
String[] words = {“may”, “the”, “force”, “be”, “with”, “you”}; for (int i = 0; i < words.length; i++) {
System.out.println(words[i]);
}
012345
“may”
“the”
“force”
“be”
“with”
“you”
Programmierung – VE04 16
© paluno
Erweiterte for-Schleife
▪ Einfacher ist die Verwendung der erweiterten for-Schleife (auch foreach-Loop genannt)
String[] words = {"may", "the", "force", "be", "with", "you"}; for (String word : words) {
System.out.println(word);
}
▪ Das gesamte Array wird durchlaufen und bei jedem Durchlauf das nächste Element zur Verfügung gestellt
▪ Ist das Array leer, wird gar nichts ausgeführt
▪ Intern arbeitet Java weiterhin mit der klassischen Zählschleife, dieses
Verhalten wird aber vor uns versteckt
“may”
“the”
“force”
“be”
“with”
“you”
012345
Programmierung – VE04 17
© paluno