IndexOutOfBoundsException beim hinzufügen eines Elements zu einer Liste

SyntaxTalksToMe

Bekanntes Mitglied
Guten Abend,

Ich habe eine Frage zur add Methode einer ObservableList. Ich habe mir natürlich die offizielle Dokumentation angeschaut und bin mir daher auch sicher, dass ich es richtig verstanden habe und theoretisch so geschehen müsste wie ich es will 🙂

Ich habe den Code stark verkürzt und nur auf die Teile heruntergebrochen, wo der Fehler entsteht:

Es beginnt, dass ich ein Directory nach Files durchsuche. Das funktioniert so wie gewollt und es ist auch nichts null oder so.

Code:
 ObservableList<File> fileList = FXCollections.observableArrayList();

fileList.add(beliebigeZahl, f);   <-----   f = File aus der Foreach Schleife

Es ist gewünscht dass das Element f an Index "beliebigeZahl" in der ObservableListe platziert wird,

Jetzt bringt er mir die Exception:

Caused by: java.lang.IndexOutOfBoundsException: Index: 11, Size: 0

Wo liegt da der Fehler? Ich füge ja der Liste etwas hinzu. Warum eine IndexOutOfBounds?

Offenbar hat er ein Problem wenn die Liste in dem Sinne keine Elemente beinhaltet und dann plötzlich eine auf Index 11 setzen soll. Würde es helfen, die liste vorher mit irgendetwas zu füllen, quasi als Platzhalter, damit die Indizies nicht null sind?
 
Es passiert genau das, was in der Doku angegeben ist - wenn der angegebene Index größer ist, als die Listengröße, fliegt diese Exception.


Warum soll denn in einer leeren Liste etwas an Index 11 gesetzt werden? Das klingt nach einem Anwendungsfall, für den eine Liste eher nicht das ideale ist...
 
Mein Ziel war es, dass der Nutzer ein Directory auswählt. In dem Directory befinden sich Images, die in einer Liste gespeichert werden sollen.
Die Besonderheit ist aber, dass die Bilder in einer speziellen Reihenfolge in die Liste geladen werden. Um das zu bewerkstelligen, sollen die Bilder nummeriert sein. Das sind natürlich Strings. Diese Strings werden aber an den entsprechenden Stellen in Integer umgewandelt. Die Dateinamen liefern also quasi bereits den gewünschten Platz in der Liste. Kurz gesagt: Ich möchte Files entsprechend ihrer Titel sortieren, damit diese in der von mir gewünschten Reihenfolge in die Liste gespeichert werden.
Dies war gewünscht um mit gewissen anderen Dingen innerhalb des Programmes zu interagieren.


Während ich diese Zeilen geschrieben habe, ist mir eine gute Lösung vor Augen erschienen und lässt meine Idee von oben ziemlich labil erscheinen. Die Lösungen für Probleme fliegen mir immer zu, wenn ich das Problem niederschreibe.

Trotzdem danke für deine Antwort.
 
Das hat mit ObservableList nix zu tun, das Verhalten ist auch bei einer "normalen" Liste so.

Intention ist eben, immer zu gewährleisten, dass die Liste "lückenlos" ist.

Aber das, was du möchtest kann relativ leicht mit einer HashMap nachgebildet werden... Code erwünscht?
 
Ich sag mal ja 🙂 Ich weiß was ein Hash ist. Aber nicht was eine Hashmap ist. Klingt jedenfalls interessant.

ich könnte mich jedes mal selbst Ohrfeigen. Das ist ein Problem bei mir. ich denke oft zu kompliziert, dabei kann ich es manchmal viel einfacher haben.
 
Ok los geht'S:
Java:
import java.util.HashMap;
import java.util.Observable;
import java.util.Observer;
import java.util.Random;

/**
 * Consider not using Observable cause of its depraction.
 * @author 
 *
 * @param <T>
 */
@SuppressWarnings("deprecation")
public class MyList<T> extends Observable {
	private HashMap<Integer, T> map = new HashMap<>();

	public void add(T t, int i) {
		if (map.containsKey(t)) {
			throw new IllegalArgumentException(i + " already added.");
		}
		map.put(i, t);
		this.setChanged();
		this.notifyObservers(t);
	}

	public static void main(String[] args) {
		MyList<String> myList = new MyList<>();
		myList.addObserver(new Observer() {
			@Override
			public void update(Observable o, Object arg) {
				System.out.println(arg + " was added.");
			}
		});

		Random rand = new Random();
		myList.add("one", rand.nextInt(10));
		myList.add("two", rand.nextInt(10));
		myList.add("three", rand.nextInt(10));
	}
}

Im Idealfall werden drei Zeilen ausgegeben.
 
Habs getestet und mit eingebaut. Funktioniert wunderbar. Genau so was hatte ich gesucht. Ich wollte es sortieren, aber mir hatte ein Wert gefehlt 🙂 Daher wurde es umständlich.
Vielen Dank!
 
Wenn du jetzt noch eine TreeMap verwendest, dann liegen deine Einträge von Anfang an in der richtigen Reihenfolge vor. Den Zeitverlust kannst du ignorieren, es geht bei weitem mehr Zeit drauf, die Dateiinformationen (Name) auszulesen.
 

Zurück
Oben