[Java] Schreiben und Löschen in ArrayList

Muuhmann

Lieutenant
Registriert
Sep. 2004
Beiträge
782
Hi Leute,

habe grade folgendes Problem.

Ich möchte die "ArrayList<Mitgliedschaft> mitglieder " iterieren lassen und jedes Objekt das mein Kriterium, der Monat soll der angegebene Monat sein, erfüllt soll in die Liste "ArrayList<Mitgliedschaft> entfernt" eingetragen werden und anschließen aus der Liste mitglieder gelöscht werden...

das Löschen funktioniert aber leider nicht so, wie ich es mir vorgestellt habe, nämlich überhaupt nicht.. ich bekomme folgende Fehlermeldung ausgegeben:

java.util.NoSuchElementException und ich habe auch mal
java.util.ConcurrentModificationException bekommen.

hier mal der code

Code:
    /**
     * Entferne alle Mitglieder aus der Sammlung des Vereins, die im
     * angegebenen Monat Mitglied geworden sind, und liefere sie in 
     * einem getrennten Sammlungsobjekt zurück.
     * @param monat Der Monat des Beitritts
     * @param jahr Das Jahr des Beitritts
     * @return die neuen Mitglieder des gegebenen Monats
     */
    public ArrayList<Mitgliedschaft> entfernen(int monat, int jahr)
    {
        ArrayList<Mitgliedschaft> entfernt = new ArrayList<Mitgliedschaft>();
        if(monat < 1 || monat > 12) {
           System.out.println("Der Monat "+monat+" ist ungülig! Muss im Bereich von 1 bis 12 liegen!");
           return entfernt;
        }
        else {
            Iterator<Mitgliedschaft> it = mitglieder.iterator();
            while(it.hasNext()) {
                if((it.next().gibMonat() == monat) && (it.next().gibJahr() == jahr)) {
                    entfernt.add(it.next());  
                    mitglieder.remove(it.next());
                }
            }
            return entfernt;
        }                    
    }
 
Hi,

das Problem ist, dass du mehrfach it.next() aufrufst. Dadurch wird jedesmal ein anderes Objekt zurückgegeben.

Wenn deine ArrayList kein nächstes Element mehr hat, wird eine java.util.NoSuchElementException geworfen.

Außerdem bietet ein Iterator die Möglichkeit das Objekt aus der Liste zu löschen, das zuletzt mit it.next() zurückgegeben wurde (Aufruf: it.remove()).

Probiere es mal so:

Code:
Iterator<Mitgliedschaft> it = mitglieder.iterator();
while(it.hasNext()) {
   Mitgliedschaft m = it.next();
   if((m.gibMonat() == monat) && (m.gibJahr() == jahr)) {
      entfernt.add(m);  
      it.remove();
   }
}
return entfernt;
 
ya wunderbar! danke!

dass ich nicht selbst darauf gekommen war.. hatte es vorher nämlich auch so, hab aber dann gedacht, das it.next() für einen durchlauf der while schleife gleich bleibt...

und it.remove() kannte ich noch nicht.. hab halt immer über mitglieder.remove(...) versucht.. wahr schon am rätseln wie ich an die id von so nem eintrag komme... (p.s. wie? ;D)
 
Muuhmann schrieb:
ya wunderbar! danke!

dass ich nicht selbst darauf gekommen war.. hatte es vorher nämlich auch so, hab aber dann gedacht, das it.next() für einen durchlauf der while schleife gleich bleibt...

und it.remove() kannte ich noch nicht.. hab halt immer über mitglieder.remove(...) versucht.. wahr schon am rätseln wie ich an die id von so nem eintrag komme... (p.s. wie? ;D)

Was verstehst du unter id? Meinst du die Position des Objektes in der ArrayList?

Das sieht dann so aus:

Code:
// m ist das Mitgliedschaft-Objekt 
int index = mitglieder.indexOf(m);
 
ya genau mit id meinte ich die position

danke of indexOf, das kannte ich bis jetzt nicht!
 
Zurück
Oben