Löschen von Objekten während Iteration über Liste

MasseElch

Aktives Mitglied
Hallo Forum.

Ich habe eine Liste mit Objekten der Klasse SlideShowImage. Die Klasse enthält ein Attribut dirPath das sagt aus welchen Ordner das Bild stammt.

Ich lasse in einer ComboBox alle Ordner anzeigen, die ein Bild in die Liste geliefert haben. Nun möchte ich in der ComboBox einen Ornder auswählen und dann alle Bilder, die von dort kommen aus der Liste entfernen.

Dazu habe die diese Methode geschrieben:

Java:
public void removeImages(String key) {
		for (Iterator<SlideShowImage> imageListIter = this.imageList.iterator(); imageListIter.hasNext();) { 
			SlideShowImage img = imageListIter.next(); 
			if(img.getDirPath().equals(key)) {
				imageListIter.remove(); 
		    }
		}
	}

Der Aufruf derMethode:

Java:
slideShow.getImageList().removeImages((String) gui.getComboBox().getSelectedItem());

Es passiert leider gar nischt :-(
Kann man überhaupt so casten wie ich das gemacht habe? Und wenn ja was mache ich dann verkehrt?

Lg
MasseElch
 
Eine mögliche Erklärung wäre, dass

Java:
if(img.getDirPath().equals(key))

immer false zurückgibt. Da du ja das selectedItem der Combobox auf String castest könnte da der Fehler liegen.

gruß sirkarpfen
 
Ja, hatte das hier:

Java:
public void removeImages(String key) {
		for (Iterator<SlideShowImage> imageListIter = this.imageList.iterator(); imageListIter.hasNext();) { 
			SlideShowImage img = imageListIter.next(); 
			if(img.getDirPath().equals(key)) {
				imageListIter.remove(); 
				System.out.println(img.getDirPath());
		    }
		}
	}

Ich hab das mal mit einer Liste laufen lassen, wo alle Bilder aus dem Ordner example stammen.

Ausgabe war:

Code:
example

Sollte doch aber für jedes Bild eine Ausgabe kommen, richtig?
Was mich auch verwirrt.

Und da ich innerhalb der If Anweisung bin, wird imageListIter.remove() ja ausgeführt, trotzdem klappt es nicht.
 
Ich hätte jetzt gesagt, dass das daran liegt, dass man in einer Iteration die Menge nicht modifizieren darf (remove).
Aber dann müsstest du denke ich eine ConcurrentModificationException bekommen.
 
Zuletzt bearbeitet:
Es wäre, wenn möglich, auch sinnvoll wenn du mal die Klasse ImageList mitlieferst, damit wir uns einen genaueren Überblick machen können. Aus der einzelnen Methode lässt sich leider nicht viel rauslesen 🙂.
 
Ich hätte jetzt gesagt, dass das daran liegt, dass man in einer Iteration die Menge nicht modifizieren darf (remove).
Aber dann müsstest du denke ich eine ConcurrentModificationException bekommen.

Ich habe ja aus genau dem Grund die Möglichkeit mit dem Iterator genutzt, damit eben das nicht passiert. Zumindest war das der Plan dahinter 😳

Hier die Klasse

Java:
package slideShowObjects;

import java.awt.Toolkit;
import java.util.LinkedList;
import java.util.List;
import java.util.Iterator;

public class ImageList {

	/**
	 * the images shown by slideShow
	 */
	private List<SlideShowImage> imageList;
	
	/**
	 * constructor
	 */
	public ImageList() {
		//create instance so we do not get problems on start up
		this.imageList = new LinkedList<SlideShowImage>();
	}
	
	/**
	 * append a list with new images for the slideShow
	 * @param newImages the new imageList
	 */
	public void appendNewImages(List<SlideShowImage> newImages) {
		
		this.imageList.addAll(newImages); 
		this.refactor();
	}
	
	/**
	 * sets the yPos of all images and makes sure everything slides right
	 */
	private void refactor() {
		
		int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
		int imageHeight = screenHeight/5;
		int refactor = -imageHeight;
		
		for(SlideShowImage img : this.imageList) {
			img.setyPos(refactor);
			refactor -= imageHeight +20;
		}
	}
	
	/**
	 * remove all images which are from the given path
	 */
	public void removeImages(String key) {
		for (Iterator<SlideShowImage> imageListIter = this.imageList.iterator(); imageListIter.hasNext();) { 
			SlideShowImage img = imageListIter.next(); 
			if(img.getDirPath().equals(key)) {
				imageListIter.remove(); 
				System.out.println(img.getDirPath());
		    }
		}
		refactor();
	}

//SETTERS & GETTERS
	
	/**
	 * return the list with images
	 */
	public List<SlideShowImage> getImageList() {
		return this.imageList;
	}
}

Und wenn das auch ützlich sein könnte:
DIe Methode wird aus einer ButtonListener-Klasse heraus aufgerufen:

Java:
 if(pressedButton == gui.getButtonDeleteDirectory()) {
			if(this.slideShow.getRunning()) {
				this.slideShow.setRunning(false);
				gui.getButtonPlay().setText("Play");
			}
			slideShow.getImageList().removeImages((String) gui.getComboBox().getSelectedItem()); 
			gui.getComboBox().removeItem(gui.getComboBox().getSelectedItem());
 
Zuletzt bearbeitet:
Stehen bei dir in der Combobox die absoluten Pfade zu den Bildern? Bzw. was genau ist bei dir in der Combobox gespeichert?

Es kann sein das img.getDirPath() den absoluten Pfad zurückgibt und deshalb img.getDirPath.equals(key) immer false zurückgibt.

Alternativ könntest du es mal probieren beim iterieren eine while() Schleife zu verwenden:

Java:
Iterator<SlideShowImage> imageListIter = this.imageList.iterator();
while(imageListIter.hasNext()) {
    // remove stuff
}
 
Zuletzt bearbeitet:

Zurück
Oben