PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Element aus LinkedList entfernen


Evalley
2006-05-08, 17:44:23
erledigt

Monger
2006-05-08, 18:03:39
Ja, über die Geschichte fall ich auch regelmäßig...

Das Problem ist, dass dein Iterator ganz zu Anfang prüft, wie groß deine List eigentlich ist. Jetzt iterierst du ein paar mal darüber, und löschst plötzlich ein Element. Jetzt stimmt die Länge der List nicht mehr - deine Schleife läuft einmal zu viel durch.

So etwas wird durch eine ConcurrentModificationException (oder so ähnlich) abgefangen. Das heißt, dass sich die Liste unerlaubterweise während der Iteration verändert hat.

Am einfachsten ist es, du sammelst alle Objekte die du entfernen willst in einer zweiten Liste, und ziehst diese dann danach komplett ab. Z.B.


List<Thingy> tempList = new LinkedList<Thingy>();
for(Thingy thingy : myList){
if(thingy.isSth()){
tempList.add(thingy);
}
}
myList.remove(tempList);

HajottV
2006-05-08, 18:48:38
Huhu,


public void delete(){
for(ListIterator list = figuren.listIterator();list.hasNext();){
Rechteck temp = (Rechteck)list.next();
if(temp.isSelektiert()) list.remove();
}
repaint();
}


Probier das mal aus.

Gruß

Jörg

Evalley
2006-05-08, 18:51:28
erledigt

Monger
2006-05-08, 20:10:56
HajottV[/POST]']...
if(temp.isSelektiert()) list.remove();
...

Ich hab mich glaub mit HellHorse vor einiger Zeit über das Thema unterhalten. Die Implementierung von #remove() auf dem Iterator scheint ein bißchen bäh zu sein. Außerdem sieht die ganze Casterei plus Iterator mies aus, eigentlich sollte man Java 5.0 konform schreiben.


Es geht, ich will nur sagen dass es vielleicht nicht ganz sauber ist.

HajottV
2006-05-09, 10:33:45
Monger[/POST]']Ich hab mich glaub mit HellHorse vor einiger Zeit über das Thema unterhalten. Die Implementierung von #remove() auf dem Iterator scheint ein bißchen bäh zu sein. Außerdem sieht die ganze Casterei plus Iterator mies aus, eigentlich sollte man Java 5.0 konform schreiben.

Es geht, ich will nur sagen dass es vielleicht nicht ganz sauber ist.

Ein Konstrukt anzuwenden, nur um des Konstruktes Willen, macht keinen Sinn.

Außerdem ist die Version mit dem 'Iterator remove' höchstwahrscheinlich effizienter und auch leichter lesbar.

Gruß

Jörg

HellHorse
2006-05-09, 17:54:55
HajottV[/POST]']Ein Konstrukt anzuwenden, nur um des Konstruktes Willen, macht keinen Sinn.
Also ich habe kein Problem mit deinem Code ;)
(Ok, über Formatierung und Benennung der Variablen kann man sich streiten)
Falls es um diesen Thread (http://www.forum-3dcenter.org/vbulletin/showthread.php?t=289631) geht. Was ich dort am Code von Xmas bemängelt habe ist nicht, dass er keine Generics braucht, sondern dass er sie nur halbherzig einsetzt. Wenn man sich explizit gegen Generics entscheidet (Komplexität, Rückwärtskompatibilität, warum auch immer) habe ich kein Problem damit. Bloss wenn man sich dafür entscheidet sollte man es aus meiner Sicht auch durchziehen.
HajottV[/POST]']
Außerdem ist die Version mit dem 'Iterator remove' höchstwahrscheinlich effizienter und auch leichter lesbar.
Das ist so ziemlich die einzige Möglichkeit eine Liste zu modifizieren während man darüber iteriert und dafür auch gedacht. Generics ändern daran ja nichts, ListIterator ist ja auch generic. Ich sehe hier wirklich kein Problem.
(Ok, ListIterator funktionier nicht mit enhanced-for und das normale for ist auch mehr ein Hack, das macht aber ListIterator nicht schlecht sondern eher enhanced-for und das normale for)

Monger
2006-05-09, 18:01:48
HellHorse[/POST]']
Falls es um diesen Thread (http://www.forum-3dcenter.org/vbulletin/showthread.php?t=289631) geht.

Nein, den meine ich nicht. Da hatte ich genau das selbe Problem wie HajottV jetzt, und wir haben darüber eine ganz ähnliche Diskussion geführt. Ist aber schon wirklich lange her, vielleicht ein halbes oder dreiviertel Jahr.