JAVA Wie löscht man bestimmte Werte in einer Arrayliste?

3 Antworten

Listen haben meistens ein Problem damit, wenn Elemente entfernt werden, während man die Liste in einer Schleife durchläuft. Bei einer einfachen for-Schleife, wie du sie benutzt, geht es, aber jedes Mal wenn du einen Eintrag löschst, überspringst du den nächsten Eintrag.

Die beste Variante, alle Einträge einer Liste nach einem Kriterium zu löschen, ist mit der removeIf Methode:

campers.removeIf(camper -> camper.getVorname().equals(vorname));

Da kannst du allerdings nicht bei jedem Eintrag der rausgenommen wird, die Liste ausgeben lassen, sondern es werden z.B. alle Jennys rausgelöscht und danach kannst du die Liste wieder anzeigen.

newinformatik 
Fragesteller
 06.12.2022, 14:48

hey :) habe ich mal geändert, jedoch wird es mir immer noch als Fehlercode angezeigt. Laut Prof sollte es aber definitiv klappen -.- da ist irgendwo ein Fehler, nur kommen wir net drauf.

0
daCypher  06.12.2022, 15:33
@newinformatik

Ich hab grade gesehen, dass die Liste bei dir camper und nicht campers heißt, das heißt, du müsstest stattdessen das hier benutzen:

camper.removeIf(c -> c.getVorname().equals(vorname));

Und bei deinem Code versuchst du "getVorname" von der ganzen Liste zu kriegen, was natürlich nicht geht und beim remove gibst du nur den Vornamen an, musst aber das camper-Objekt oder den index angeben.

Also (mal etwas aufgeräumt):

while (camper.size() > 1) { // während die arrayliste mehr als einen eintrag hat
    printVornamen();        // SPRINGEN NACH UNTEN 
    System.out.print("\nWer fliegt raus? ");
    String vorname = keyScan.nextLine();


    // TODO: Den Camper mit dem angegebenen Vornamen entfernen
    // Problem: Du überspringst immer einen Camper, wenn du einen rausschmeißt, 
    // weil die restlichen Camper aufrücken und du gleichzeitig immer einen Index weitergehst
    for (int i=0; i<camper.size(); i++){
        if (camper.get(i).getVorname().equals(vorname)) {
            camper.remove(i);   
        }
    }
}

Um das Problem mit den übersprungenen Campern zu lösen, könntest du nach jedem gelöschten Camper die Variable i um eins verringern, also so:

for (int i=0; i<camper.size(); i++){
    if (camper.get(i).getVorname().equals(vorname)) {
        camper.remove(i);   
        --i;
    }
}

oder du machst es halt mit der removeIf Methode:

while (camper.size() > 1) { // während die arrayliste mehr als einen eintrag hat
    printVornamen();        // SPRINGEN NACH UNTEN 
    System.out.print("\nWer fliegt raus? ");
    String vorname = keyScan.nextLine();


    // TODO: Den Camper mit dem angegebenen Vornamen entfernen
    camper.removeIf(c->c.getVorname().equals(vorname));
}

Falls trotzdem noch Fehler auftauchen, wäre es natürlich sehr hilfreich zu wissen, welcher Fehler auftaucht. Dass irgendein Fehler auftaucht, hilft nicht weiter. Vielleicht kannst du auch den Code irgendwo teilen (github.com oder pastebin.com), damit wir uns mal einen Überblick schaffen können.

0
newinformatik 
Fragesteller
 06.12.2022, 16:12
@daCypher

jetzt habe ich es auch komplett gerafft! Danke dir!!!!! Hat nun geklappt :p bin so happy gerade.

1

In deinem Schleifenrumpf verwendest du i gar nicht.

Reicht nicht statt camper.getVorname camper[i]?

newinformatik 
Fragesteller
 06.12.2022, 13:34

es muss halt dem Userinput entsprechen und dann ein Output geben.. hat nicht so geklappt.

0
newinformatik 
Fragesteller
 06.12.2022, 13:40
@Suboptimierer

ja da hast du recht.. also mit getVorname wollte ich die Vornamen rüber holen, da die in der anderen class privat sind. Und dann prüfen und entsprechend löschen und dann die neue Liste ausgeben. Nun sagt mit mein Programm aber das dort dennoch ein Fehler ist.

0
newinformatik 
Fragesteller
 06.12.2022, 13:47
@Suboptimierer

der gesamte Code sieht folgendermassen aus:

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	static ArrayList<Camper> camper = new ArrayList<Camper>();

	public static void main(String[] args) {
		Scanner keyScan = new Scanner(System.in);
		camper.add(new Camper("Jenny", "Frankhauser"));
		camper.add(new Camper("Giuliana", "Farfalla"));
		camper.add(new Camper("Tatjana", "Gsell"));
		camper.add(new Camper("Sandra", "Steffl"));
		camper.add(new Camper("Natascha", "Ochsenknecht"));
		camper.add(new Camper("Tina", "York"));
		
		while (camper.size() > 1) { // während die arrayliste mehr als einen eintrag hat
			printVornamen(); // SPRINGEN NACH UNTEN 
			System.out.print("\nWer fliegt raus? ");
			String vorname = keyScan.nextLine();
			// TODO: Den Camper mit dem angegebenen Vornamen entfernen
            for (int i=0; i<camper.size(); i++){
            if (camper.get(i).getVorname.equals(vorname)) {
            camper.remove(vorname);	
            printVornamen();
            
		}}}
		
		// TODO: Verbleibenden Camper ausgeben
		System.out.print(camper.get(0)+" hat gewonnen!");
		keyScan.close();
	}
	
	static void printVornamen() {
		System.out.println("Verbleibende Camper:");
		for (int i=0; i<camper.size(); i++) {
			System.out.print(camper.get(i).getVorname()+" ");
		}
	}
}

0
Suboptimierer  06.12.2022, 13:52
@newinformatik

Ist halt die Frage, was remove(vorname) macht. Ich hätte erwartet, dass dort remove(i) oder oder get(i).remove() oder ähnliches stehen müsste.

0
newinformatik 
Fragesteller
 06.12.2022, 13:58
@Suboptimierer

hmm hat mir leider auch nicht weitergeholfen.. dennoch lieben Dank fürs Bemühen..

0
Suboptimierer  06.12.2022, 14:01
@newinformatik
camper.get(0)+" hat gewonnen!"

Was liefert eigentlich get? Einen String? Ein Objekt? Das Objekt gibt automatisch beim Verketten mit Text Text zurück?

0
newinformatik 
Fragesteller
 06.12.2022, 14:07
@Suboptimierer

der Teil vom Code bedeutet, dass es den verbliebenen letzten Wert ausgibt. Sprich, der name der übrig ist hat in dem Falle gewonnen, weil die restlichen durch den Userinput je Runde gelöscht wurden.

0
Suboptimierer  06.12.2022, 14:13
@newinformatik

Ist zwar nicht das Problem, welchem du hinterher jagst, aber den Zugriff auf 0 halte ich für gefährlich, da die Möglichkeit besteht, dass du mit der for-Schleife alle Camper gelöscht hast und es am Ende kein Element 0 mehr gibt.

Was für eine Fehlermeldung bekommst du denn?

0
newinformatik 
Fragesteller
 06.12.2022, 14:19
@Suboptimierer

genau deswegen habe ich im loop oben >1 eingegeben, dass immer ein Element übrig bleibt :) dennoch danke! mein Problem ist wirklich oben beim Löschen und bei der Ausgabe der aktualisierten Liste -.-

0
Suboptimierer  06.12.2022, 15:39
@newinformatik

Richtig, du fragst es oben im while ab, aber theoretisch könnte die Liste direkt nach dem Verlassen der for-Schleife leer sein, zum Beispiel wenn im letzten Schritt die Liste 3x den Vornamen 'Max' enthält und du dann alle Max removst.

Es gibt noch eine Tücke beim Löschen von Elementen aus einem Array:

Wenn du sagen wir ein Array mit den Elementen a, b und c hast und die Schleife von 0 bis size()-1 laufen lässt und dann b löschst, wird c nicht mehr geprüft, weil der cursor auf size-1 steht.
Das heißt, du müsstest nach dem Löschen eines Elements i-- rechnen oder du durchläufst die Schleife rückwärts.

0
newinformatik 
Fragesteller
 06.12.2022, 16:14
@Suboptimierer

lieben Dank, habe es zwischenzeitlich nun endlich lösen können. Deine Denkansätze haben mir aber anderweitig auch super geholfen! lieben Dank. Die zuletzt erwähnten Punkte habe ich nun auch verstanden :p

1

while (camper.size() > 1) { // während die arrayliste mehr als einen eintrag hat

  printVornamen(); // SPRINGEN NACH UNTEN

  System.out.print("\nWer fliegt raus? ");

  String vorname = keyScan.nextLine();

  // TODO: Den Camper mit dem angegebenen Vornamen entfernen

  for (int i = 0; i < camper.size(); i++) {

    Camper currentCamper = camper.get(i);

    if (currentCamper.getVorname().equals(vorname)) {

      camper.remove(i);

      printVornamen();

    }

  }

}

Adrian2612  11.12.2022, 20:39

Es sieht so aus, als ob Sie versuchen, den Camper mit dem angegebenen Vornamen aus der

camper

-Arraylist zu entfernen. Es gibt jedoch einige Fehler in Ihrem Code, die dazu führen, dass er nicht wie erwartet funktioniert.

Zunächst einmal scheint die

printVornamen

-Methode nicht im Code definiert zu sein, da sie nicht deklariert oder implementiert wurde. Sie müssen also zuerst eine Methode

printVornamen

erstellen, die die Liste der Camper und ihre Vornamen ausgibt.

Außerdem verwenden Sie in der

for

-Schleife die

camper.getVorname()

-Methode, um den Vornamen des aktuellen Camper-Elements zu erhalten. Allerdings gibt es keine solche Methode in der

camper

-Arraylist, da sie nur Camper-Objekte enthält und keine Methoden, die direkt auf die Vornamen der Camper zugreifen. Stattdessen müssen Sie ein Camper-Objekt aus der Liste auswählen und dann die

getVorname()

-Methode auf diesem Objekt aufrufen, um den Vornamen zu erhalten.

Schließlich verwenden Sie in der

if

-Anweisung die

camper.remove(vorname)

-Methode, um den Camper mit dem angegebenen Vornamen aus der Liste zu entfernen. Allerdings gibt es keine

remove

-Methode in der

camper

-Arraylist, die einen Vornamen als Eingabeparameter erwartet. Stattdessen müssen Sie den Index des zu entfernenden Elements aus der Liste übergeben.

Um diese Fehler zu beheben, können Sie den Code wie folgt ändern:

0