Q1 OOP in Java

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.

Die Aufgabenstellung lautet

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

Lottozahlen.java
/* meininfokurs.cmrg.site */
/**
 *
 * 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.

AufrufWas Java daraus machtErgebnis
remove(1)remove(int index) – löscht nach Positionentfernt die 17
remove(Integer.valueOf(1))remove(Object o) – löscht nach Wertentfernt 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

Konsole
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.

Aufgabe suchen

Tippe los. Strg+K öffnet die Suche von überall.

Zuletzt angesehen

Werbung