Aus der Liste über die du iterierst darfst du kein Objekt einfach so entfernen - das gibt eine Exeption.
Wieso auch? Machst ja nichts verbotens ;-)und dann gibts wirklich keine currentModificationException (oder wie die genau heisst?)
Aus einer Liste etwas entfernen über die man iteriert war wohl eines der ersten Problem in das uns der Dozent hineinlaufen liess - im Allgemeinen Fall ist es sicher nicht gut.
Mit einer for Schleife am Listenende beginnend über die Liste iterieren und dann die relevanten Objekte aus dieser entfernen.
Ich versteh jetzt aber wirklich nur Bahnhof.Du mußt halt nur den Iterator zum Entfernen benutzen, nicht die Listenmethoden.
import java.util.Vector;
public class ListenTest {
private static Vector<Integer> vect = new Vector<Integer>();
public static void main(String[] args) {
for(int i=0; i<10; i++)
vect.add(i);
// so geht es
for(Integer i : (Vector<Integer>)vect.clone())
if (i%2==0)
vect.remove(i);
vect.clear();
for(int i=0; i<10; i++)
vect.add(i);
// so geht es eben nicht
for(Integer i : vect)
if (i%2==0)
vect.remove(i);
}
}
Muss es dann ungefähr so machen:Ich versteh jetzt aber wirklich nur Bahnhof.
for(int i=0; i<10; i++)
vect.add(i);
for (Iterator it = vect.iterator(); it.hasNext();) {
int i = it.next();
if (i%2==0) {
it.remove(); //beim Iterator die Methode aufrufen, nicht bei der Liste
}
}
Oder du nimmst den Iterator:Wenn ich etwas aus einer Liste entfernen will muss ich es ja der Liste sagen dass da eines entfernt wird?
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<Integer>();
for (int i = 0; i < 100; i++) {
numbers.add(i);
}
Iterator<Integer> it = numbers.iterator();
while (it.hasNext()) {
int i = it.next();
if (i % 2 == 0) {
it.remove();
}
}
System.out.println(numbers);
}
Nur wenn man verpfuschten Code als besser zu lesen bezeichnen möchte, nix anderes ist das nämlich.Hm, die Variante mit dem clone gefällt mir besser - ist kompakter zu lesen.
Er hat gesagt er versteht nur Bahnhof, wir haben ihm den Iterator Code gezeigt, wo ist das Problem?!Ich hätte jetzt noch eine revolutionäre, absolut neue und hier noch nie genannte Idee: nimm den Iterator... wow...
for (Iterator<Integer> it = vect.iterator(); it.hasNext();)
if (it.next()%2==0)
it.remove();
Er hat gesagt er versteht nur Bahnhof, wir haben ihm den Iterator Code gezeigt, wo ist das Problem?!
Wodurch solltest du denn Konzepte verstehen die dir neu sind, wenn nicht durch lesen der Doku?Ja, es geht auch Kompakt, aber verstehen werde ich das vielleicht wenn ich mal alt und erfahren bin :noe:Java:for (Iterator<Integer> it = vect.iterator(); it.hasNext();) if (it.next()%2==0) it.remove();
Der Iterator ist das worüber ich iteriere und da darf ich wegnehmen ???:L
Die Liste liegt einfach so rum - da darf ich nichts wegnehmen ???:L
Nur wenn man verpfuschten Code als besser zu lesen bezeichnen möchte, nix anderes ist das nämlich.
Sowas gehört zu den Basics.
Das kam nur davon weil innert weniger Minuten zwei identische Aussagen kamen und er vermutlich auch schon am tippen derselben Aussagen war![]()
Arbeiten mit Collections gehört zu den Basics in Java, wenn man die nicht drauf hat sollte man mehr lesen & fragen anstatt zu versuchen mit seinem Halbwissen falsche Antworten zu geben.WAS gehört zu den Basics?
Bitte schön:Wenn es deine persönlich Meinung ist so etwas verpfuscht zu finden, dann lass ich sie ohne Komentar gelten
Wenn du es aber deine Aussage für allgemein gültig hälst währe zwingend eine Erklärung fällig.
So langsam fühle ich mich persönlich angegriffen!
Letzte Äusserung zu diesem Thema:
Ich habe eine Aussage von einem mir Unbekannten in einen Forum - ok, nur ohne Begründung etwas zu glauben ist Religion - Religion ist Opium für das Volk und damit hab ich es nicht.
Also WARUM soll man das eine tun und das andere nicht?
Dann zum Link der sehr früh genannt wurde
Removes from the underlying collection the last element returned by the iterator (optional operation). This method can be called only once per call to next. The behavior of an iterator is unspecified if the underlying collection is modified while the iteration is in progress in any way other than by calling this method.
Was will "(optional operation)" aussagen?
WARUM darf ich denn nicht direkt von der "underlying" collection etwas entfernen?
(Nein "weil es sonst eine Exception gibt" reicht als Begründung nicht! "Ist so weil ist so" auch nicht)
Ich bin Ingenieur und die neigen bekanntlich dazu, dass sie immer wissen müssen WARUM etwas ist...
Etwas auswendig gelernt: SUPER ein Problem sehr schnell gelöst
Einmal Hintergründe begriffen: Noch besser! Mit etwas mehr Aufwand viele Probleme gelöst.
Sie wird oft dann geworfen(bzw. die meisten Fragen im Zusammenhang mit dieser Exception entstehen…), wenn man mit einem Iterator (for-each, iterator(), etc.) über eine Collection läuft und dabei diese Collection direkt über Methoden der Collection verändert (dabei spielt es keine Rolle ob dies durch den selben Thread passiert(oder man sogar nur einen hat), oder aber ein anderer Thread eine Veränderung an ihr durchführt)
Das kommt daher, dass die Iteratoren als sogenannte fail-fast Iteratoren implementiert sind, das heißt, dass sie lieber sofort bei Änderungen reagieren(also eine RuntimeException wie diese werfen) , anstatt später irgendwann in ein willkürliches, nicht-deterministisches Verhalten zu laufen.
Optional operation, weil optional niemand zwing dich diese zu benutzen.
Der Haarspalter ;-) hat natürlich recht. Weil das ein Interface ist, muss die Methode implementiert werden...(implmementieren aber nicht unterstützen)