2009-09-28 6 views
1

Comment supprimer un élément spécifique sur la liste?Comment supprimer un élément spécifique sur la liste

... 
java.util.List<Polygon> triangles = new LinkedList<Polygon>(); 
Point startDrag, endDrag, midPoint; 
Polygon triangle; 

.... 
int[] xs = { startDrag.x, endDrag.x, midPoint.x }; 
int[] ys = { startDrag.y, startDrag.y, midPoint.y };  

triangles.add(new Polygon(xs, ys,3)); 
.... 

public void mouseClicked(MouseEvent e) { 
... 
    startDrag = new Point(e.getX(), e.getY()); 
    for (Polygon p:triangles){ 
    if (p.contains(startDrag)) //Polygon has a 'contains(Point)' method 
      remove (p.contains(startDrag)); 
    } 
....   

Répondre

2

Vous ne pourrez pas retirer l'objet de la liste triangles si vous itérez actuellement dessus. Si vous essayez de le faire, vous allez déclencher un ConcurrentModificationException. Au lieu de cela, ce que vous devez faire est de faire une copie de la liste et itérer sur cela, et quand vous obtenez un coup, retirez l'élément de l'original:

public void mouseClicked(MouseEvent e) { 
... 
    Polygon[] triArray = triangles.toArray(new Polygon[triangles.size()]); 
    startDrag = new Point(e.getX(), e.getY()); 
    for (Polygon p:triArray){ 
    if (p.contains(startDrag)) //Polygon has a 'contains(Point)' method 
      triangles.remove (p); 
    } 
.... 
+0

Merci pour le code akf :-) – Jessy

3

Pour enlever par objet, comme la suppression d'un triangle spécifique à partir d'une liste de triangles, utilisez List :: remove (Object)

Pour les raisons ci-dessus, vous pouvez cependant utiliser List::listIterator(). Quelque chose comme:

ListIterator<Polygon> it = triangles.listIterator(); 
while (it.hasNext()) { 
    if (it.next().contains(startDrag)) { 
    it.remove(); 
    break; 
    } 
} 
+3

Just 'List' /' Collection.iterator' devrait suffire. –

0

C'est un méchant, je creusais - c'est le fil du système de doigt sur la souris étant identifiée comme non le créateur du java.util.Thingamabob (une nouvelle structure de données à paraître demain)

Malgré la documentation, en alignement avec le bon sens, ce que la chose n'est en fait voir que le fil de mouseClicked est pas le fil qui a créé

java.util.List<Polygon> triangles

en utilisant quelque chose de l'ordre de fil ID ou tel que nommer des threads vont puis jette une exception à partir de la JVM (définit l'indicateur d'exception du côté C) puis retourne vous laissant sans exception d'exception.getMessage() .....

Vous peut implémenter la sémantique de copie et la version originale fonctionnera, fait un peu de torsion sur votre cerveau mais cela fonctionne.

+1

De quoi parlez-vous? –

+0

c'est assez profond, je n'ai pas eu une bonne fiabilité en essayant d'y répondre mais ce que j'essayais de dire était de noter pour le lecteur que "Concurrent Modification Exception" n'était pas implémenté comme je le pensais - plutôt que de détecter deux threads. fait un remove() ce qui avait été fait était de mettre l'indicateur d'exception dans le jvm uniquement sur la base que le thread essayant un remove() n'était pas le thread qui avait créé le java.uti.Collection. Un bouton fonctionnant à partir d'un thread d'événement système n'a pas pu être modifié même si la sémantique de synchronisation a été observée. –

Questions connexes