Arrays
Kurz gesagt: Ein Array ist eine Reihe von Werten eines Typs unter einem Namen. Jedes Element hat eine Nummer, seinen Index, der bei 0 beginnt.
Problem
Dreißig Noten
Eine Lehrerin schreibt ein Programm für die Punkte aus der Klassenarbeit. Für fünf Schüler legt sie fünf Variablen an:
int score1 = 62;int score2 = 85;int score3 = 47;int score4 = 91;int score5 = 78;int sum = score1 + score2 + score3 + score4 + score5;System.out.println(sum);363In der Klasse sind aber dreißig. Dreißig Variablen, dreißig Summanden. Und für die höchste Punktzahl braucht es noch neunundzwanzig Vergleiche. Die Schleife aus der letzten Lektion hilft nicht: Sie kann nicht durch score1, score2, score3 gehen, denn das sind getrennte Namen. Wir brauchen viele Werte unter einem Namen.
Die Idee
Ein Array: eine Reihe von Kästchen
Ein Array ist eine Reihe von Werten eines Typs unter einem Namen. Jeder Wert, ein Element des Arrays, hat eine Nummer: seinen Index. Die Indizes beginnen bei 0.
int[] scores = { 62, 85, 47, 91, 78 };System.out.println(scores[0]);System.out.println(scores[4]);System.out.println(scores.length);scores[2] = 50;System.out.println(scores[2]);6278550int[]ist der Typ: „ein Array vonint“. Die Werte stehen in{ }.
scores[0]ist das erste Element,scores[4]das fünfte. Der letzte Index ist immer um 1 kleiner als die Anzahl.scores.lengthist die Anzahl der Elemente. Hier ist sie 5.scores[2] = 50;ändert ein Element. Die anderen bleiben gleich.
Wenn du die Werte noch nicht kennst, legst du das Array nur mit einer Größe an. Dann sind alle Elemente 0:
int[] booked = new int[3];booked[1] = 2;System.out.println(booked[0] + " " + booked[1] + " " + booked[2]);0 2 0Die Größe wird beim Anlegen festgelegt und ändert sich danach nicht mehr.
Genauer, für Neugierige
- Die Indizes gehen nur von 0 bis zur Anzahl minus 1. Ein negativer Index liegt außerhalb des Arrays.
Probier es aus
Welches ist welches?
Was gibt das Programm aus?
int[] prices = { 12, 7, 30, 5 };System.out.println(prices[1] + prices[3]);Wir zählen ab 0: prices[1] ist 7 (das zweite), prices[3] ist 5 (das vierte). 7 + 5 = 12. Wenn du ab 1 zählst, nimmst du 12 und 30.
Die Idee
Eine Schleife durch das Array
Jetzt hilft die Schleife. Der Zähler i wird zum Index: Er geht von 0 bis zum letzten und nimmt in jeder Runde scores[i].
int[] scores = { 62, 85, 47, 91, 78 };int sum = 0;for (int i = 0; i < scores.length; i++) { sum += scores[i];}System.out.println("Summe: " + sum);System.out.println("Durchschnitt: " + (double) sum / scores.length);Summe: 363Durchschnitt: 72.6Die Bedingung ist i < scores.length und keine feste Zahl. Wenn du alle dreißig Noten in { } einträgst, ändert sich die Schleife nicht. Das nennt man das Array durchlaufen.
(double) ist wegen der Ganzzahldivision nötig: 363 / 5 ist 72, wir brauchen aber 72,6.
Sieh es dir an
Die höchste Punktzahl
Wie findest du die größte Zahl? Du merkst dir die bisher größte und ersetzt sie, sobald du eine größere siehst.
int[] scores = { 62, 85, 47, 91, 78 };int max = scores[0];for (int i = 1; i < scores.length; i++) { if (scores[i] > max) { max = scores[i]; }}System.out.println(max); // 91Schritt für Schritt, in Worten
- Fünf Punktzahlen nebeneinander. Die Zahlen darunter sind die Indizes: von 0 bis 4.
- max beginnt beim ersten: scores[0] ist 62.
- i = 1: 85 > 62, also wird max zu 85.
- i = 2: 47 ist nicht größer als 85. Nichts ändert sich.
- i = 3: 91 > 85, also wird max zu 91.
- i = 4: 78 < 91. Dann wird i zu 5, 5 < scores.length ist falsch, und die Schleife endet.
- Die höchste Punktzahl ist 91.
max beginnt beim ersten Element und nicht bei 0. Wären alle Punktzahlen negativ, würde 0 „gewinnen“, obwohl sie gar nicht im Array steht. Deshalb beginnt die Schleife auch bei i = 1: Das erste Element steckt schon in max.
Probier es aus
Finde den Fehler
Das Programm soll die Summe 363 ausgeben. Stattdessen bricht es mit einem Fehler ab:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5In welcher Zeile ist der Fehler?
Wähle die Zeile mit dem Fehler.
<= macht die Schleife eine Runde mehr, mit i = 5. Die Indizes eines Arrays mit 5 Elementen gehen von 0 bis 4, ein Element scores[5] gibt es nicht. Das Programm liest keinen fremden Speicher, sondern bricht mit einem Fehler ab. Das nennt man über das Array hinausgehen. Die Korrektur ist i < scores.length.Die Idee
for-each: für jedes Element
Wenn du nur die Werte brauchst und nicht die Indizes, gibt es eine kürzere Schleife. Wie viele Schüler haben die Prüfung bestanden (60 Punkte oder mehr)?
int[] scores = { 62, 85, 47, 91, 78 };int passed = 0;for (int score : scores) { if (score >= 60) { passed++; }}System.out.println("Prüfung bestanden: " + passed);Prüfung bestanden: 4Man liest sie so: „für jedes score aus scores“. Sie heißt for-each. Es gibt keinen Zähler und keinen Index, deshalb kannst du nicht über das Array hinausgehen.
Es gibt aber auch eine Grenze: Du weißt nicht, bei welchem Index du bist, und du kannst das Element nicht ändern.
Genauer, für Neugierige
- Wenn du im Rumpf
score = 0;schreibst, änderst du nur die Kopie inscore. Das Array bleibt gleich. Der Compiler hält dich nicht auf.
- Um Elemente zu ändern oder wenn du den Index brauchst (zum Beispiel für den Nachbarn
scores[i + 1]), nimmst du ein normalesfor.
Probier es aus
Zwei Namen, ein Array
Was gibt das Programm aus?
int[] prices = { 10, 20, 30 };int[] sale = prices;sale[0] = 5;System.out.println(prices[0]);int b = a; den Wert. Bei Arrays ist das anders: sale = prices erzeugt kein neues Array, sondern gibt demselben Array einen zweiten Namen. Deshalb sieht man eine Änderung über sale auch über prices. Warum das so ist, erfährst du im Modul „Klassen und Objekte“: Ein Array ist ein Objekt, und die Variable speichert, wo es liegt.Genauer, für Neugierige
Eine echte Kopie machst du mit einem neuen Array und einer Schleife:
int[] prices = { 10, 20, 30 };int[] sale = new int[prices.length];for (int i = 0; i < prices.length; i++) { sale[i] = prices[i];}sale[0] = 5;System.out.println(prices[0] + " " + sale[0]);10 5prices.clone() macht dasselbe.
Probier es aus
Bring die Zeilen in die richtige Reihenfolge
Das Programm soll den niedrigsten Preis finden. Bring seine Zeilen in die richtige Reihenfolge.
int[] prices = { 18, 7, 25, 12 };for (int i = 1; i < prices.length; i++) {}if (prices[i] < min) {min = prices[i];int min = prices[0];}System.out.println(min);
Übung
Rechnen mit einem Array
Löse die Aufgaben in deinem Editor. Jedes Programm liest zuerst, wie viele Zahlen es sind, und dann die Zahlen selbst, eine pro Zeile:
Scanner in = new Scanner(System.in);int n = in.nextInt();int[] numbers = new int[n];for (int i = 0; i < n; i++) { numbers[i] = in.nextInt();}1. Summe, gerade, ungerade. Gib die Summe aller Zahlen aus, die Summe der geraden und die der ungeraden.
3123Summe: 6Gerade: 2Ungerade: 42. Umgekehrt. Lege zusätzlich ein Array mit denselben Zahlen in umgekehrter Reihenfolge an und gib es in einer Zeile aus.
5123455 4 3 2 13. Kleinste, größte, Durchschnitt. Mit einem einzigen Durchlauf durch das Array.
549274Kleinste: 2Größte: 9Durchschnitt: 5.2Übung
Sortieren und zählen
4. Sortieren. Sortiere die Zahlen von der kleinsten zur größten. Tipp: Geh durch das Array, und wenn zwei Nachbarn in der falschen Reihenfolge stehen, vertausche sie (das Vertauschen kennst du aus der Lektion über Variablen). Wiederhole das, bis es nichts mehr zu vertauschen gibt. Das nennt man Bubblesort: Die großen Zahlen „steigen“ wie Blasen ans Ende.
5427193253 7 19 25 425. Längste Folge. Finde die längste Folge gleicher Zahlen direkt hintereinander.
822555155Die Zahl 5, 3-mal hintereinander6. Notenstatistik. Lies Noten von 2 bis 6 ein und gib aus, wie viele es von jeder Note gibt. Tipp: ein Array counts mit 7 Elementen, in dem die Note der Index ist: counts[grade]++.
864563265Ausgezeichnet (6): 3Sehr gut (5): 2Gut (4): 1Ausreichend (3): 1Ungenügend (2): 1Weitere Aufgaben
- Median. Die Zahl in der Mitte des sortierten Arrays. Für 3, 1, 4, 1, 5 ist der Median 3. Bei einer geraden Anzahl von Zahlen ist der Median der Durchschnitt der beiden in der Mitte: Für 7, 1, 3, 9 ist er (3 + 7) / 2 = 5.
- Symmetrisches Array. Liest es sich von vorne nach hinten genauso wie von hinten nach vorne? 1 2 3 2 1 ist symmetrisch, 1 2 3 1 nicht.
- Römische Zahlen. Lies eine Zahl von 1 bis 3999 ein und gib sie in römischen Zahlen aus: 2024 ist MMXXIV, 1994 ist MCMXCIV. Tipp: zwei Arrays nebeneinander, eines mit den Werten
1000, 900, 500, 400, 100, …, 1und eines mit den Zeichen"M", "CM", "D", "CD", "C", …, "I". Solange die Zahl mindestens so groß ist wie der aktuelle Wert, hängst du das Zeichen an und ziehst den Wert ab.
Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: Eingabe und Ausgabe · Operatoren und Arithmetik · Bedingungen · Schleifen
- Geht weiter in: Zweidimensionale Arrays · Strings: mit Text arbeiten · Parameter und return · Überladen
- Aufgaben zum Thema: Sprachgrundlagen