2009-09-28 55 views
1

如何删除列表上的特定元素?如何删除列表上的特定元素

... 
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)); 
    } 
....   

回答

2

您将无法如果当前迭代它从triangles列表中删除的对象。如果您尝试这样做,您将触发ConcurrentModificationException。相反,你应该做的是使该列表的副本,并遍历的是,当你得到一击,从原来的删除项目:

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

感谢代码akf :-) – Jessy

3

若要删除对象,如删除特定的三角形从三角形列表中,使用List :: remove(Object)

为了达到上述目的,您可能需要使用List::listIterator()。喜欢的东西:

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

只需'List' /'Collection.iterator'就足够了。 –

0

这是一个讨厌的,我挖 - 这是从鼠标单击该系统线程被认定为java.util.Thingamabob的不是创造者(一个新的数据结构明天公布)

尽管文档,与常识对齐,什么事都实际上是看到,从的mouseClicked线程是不是使用线程的数量级上的东西创建

java.util.List<Polygon> triangles

线程ID或诸如线程命名等,然后从JVM内部深处抛出一个异常(在C端设置异常标志),然后返回,使您无法正常运行exception.getMessage().....

您可以实现复制语义,并且原始版本可以工作,对你的大脑有一些扭曲,但是它可以工作。

+1

你在说什么? –

+0

它很深,我没有很好的可靠性试图回答这些问题,但是我想说的是,为读者指出“并发修改异常”没有按照我的想法实现 - 而不是检测两个线程中的哪一个remove()做了什么只是在尝试remove()的线程不是创建java.uti.Collection的线程的基础上,在jvm中设置异常标志。即使观察到同步语义,从系统事件线程工作的按钮也无法修改。 –