ArrayList: Lottozahlen
Lösung geprüft
Die Aufgabe der heutigen Stunde sind die Lottozahlen! Hier geht es um
die Methoden, die eine ArrayList so mitbringt – und um
eine Stelle, an der man sich fast garantiert vertut. Teil 4 ist
ausdrücklich eine Fangfrage, und du sollst erst raten und dann
ausprobieren.
1. Die Lottozahlen vom Samstag waren 1, 17, 25, 30, 31, 33.
Speichern Sie sie in einer ArrayList „lottozahlen".
2. Prüfen Sie, ob sich die Zahl 12 in der Liste befindet. Prüfen Sie,
ob sich die Zahl 31 in der Liste befindet.
3. Lassen Sie sich die Länge der Liste ausgeben (es müsste 6
herauskommen).
4. Angenommen, Sie würden diesen Befehl eingeben:
lottozahlen.remove(1); – Was glauben Sie: Welche Zahl
würde entfernt werden? Probieren Sie es aus, NACHDEM Sie Ihre
Vermutung angestellt haben.
Lösungsprozess der Aufgabe
/**
*
* ArrayList verwenden - Lottozahlen
*
* @version 1.0 vom 09.09.2025
* @meininfokurs.cmrg.site
*/
import java.util.ArrayList;
public class Lottozahlen {
public static void main(String[] args) {
// 1. Die Ziehung vom Samstag
ArrayList<Integer> lottozahlen = new ArrayList<Integer>();
lottozahlen.add(1);
lottozahlen.add(17);
lottozahlen.add(25);
lottozahlen.add(30);
lottozahlen.add(31);
lottozahlen.add(33);
System.out.println("Ziehung: " + lottozahlen);
// 2. Ist die Zahl dabei?
System.out.println("Ist die 12 dabei? " + lottozahlen.contains(12));
System.out.println("Ist die 31 dabei? " + lottozahlen.contains(31));
// 3. Wie viele Zahlen sind es?
System.out.println("Anzahl der Zahlen: " + lottozahlen.size());
// 4. Die Fangfrage: remove(1) loescht NICHT die Zahl 1,
// sondern das Element an Index 1 - also die 17.
lottozahlen.remove(1);
System.out.println("Nach remove(1): " + lottozahlen);
// Wenn man wirklich die Zahl 1 loeschen will, muss man den Wert
// als Objekt uebergeben:
lottozahlen.remove(Integer.valueOf(1));
System.out.println("Nach remove(Integer.valueOf(1)): " + lottozahlen);
} // end of main
} // end of class Lottozahlen
Warum Integer und nicht int
In die spitzen Klammern gehört ein Objekttyp, also
ArrayList<Integer> und nicht
ArrayList<int>. Trotzdem darfst du
lottozahlen.add(17); schreiben und musst nicht
new Integer(17) bauen – Java packt die Zahl automatisch
ein. Das nennt sich Autoboxing. Beim Herausholen wird sie genauso
automatisch wieder ausgepackt.
Das ist bequem, und genau daher kommt auch die Falle in Teil 4.
contains und size
lottozahlen.contains(12) // false
lottozahlen.contains(31) // true
lottozahlen.size() // 6
contains gibt einen boolean zurück, den kann
man direkt an einen String hängen – dann steht da „true" oder „false".
Wer wissen will, wo die Zahl steht, nimmt
indexOf(31), das liefert hier 4. Ist die Zahl nicht drin,
kommt -1 zurück.
Teil 4 – die Falle mit remove
Die meisten tippen als Vermutung „die 1 wird entfernt". Das ist falsch,
und der Grund ist gemein: remove gibt es zweimal.
| Aufruf | Was Java daraus macht | Ergebnis |
|---|---|---|
remove(1) | remove(int index) – löscht nach Position | entfernt die 17 |
remove(Integer.valueOf(1)) | remove(Object o) – löscht nach Wert | entfernt die 1 |
Das ist Methoden-Überladung, dasselbe Thema wie bei den Konstruktoren:
zwei Methoden mit gleichem Namen, unterschieden am Parametertyp. Und
hier beißt es sich mit dem Autoboxing. Schreibst du
remove(1), ist die 1 ein int.
Java findet eine Methode, die genau int nimmt – die mit dem
Index – und nimmt die. Es packt die Zahl gar nicht erst in ein
Integer ein, weil es das nicht muss.
Bei einer ArrayList<String> tritt das Problem nie
auf, weil ein String niemals als Index durchgeht. Nur bei
Zahlenlisten knallt es. Wenn du also einen Wert löschen willst
und nicht eine Position, schreib es ausdrücklich hin.
Und so sieht es aus
Ziehung: [1, 17, 25, 30, 31, 33]
Ist die 12 dabei? false
Ist die 31 dabei? true
Anzahl der Zahlen: 6
Nach remove(1): [1, 25, 30, 31, 33]
Nach remove(Integer.valueOf(1)): [25, 30, 31, 33]
Nebenbei: System.out.println(lottozahlen) gibt die ganze
Liste in eckigen Klammern aus, ohne dass man eine Schleife braucht. Das
geht bei einem normalen Array nicht – da bekommst du
so etwas wie [I@6d06d69c zu sehen. Noch ein Punkt für die
Liste.