如何删除List上的特定元素

时间:2009-09-28 01:08:07

标签: java list linked-list

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

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

3 个答案:

答案 0 :(得分:3)

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

出于上述目的,您可能希望使用List::listIterator()。类似的东西:

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

答案 1 :(得分: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);
   }
....

答案 2 :(得分:0)

这是一个讨厌的,我挖了它 - 它是来自Mouse Clicked的系统线程被识别为不是java.util.Thingamabob的创建者(明天将发布的新数据结构)

尽管有文档,但与常识一致,实际上是什么东西看到来自MouseClicked的线程不是创建的线程

java.util.List<Polygon> triangles

使用线程ID的顺序或者诸如线程命名之类的东西然后从JVM深处抛出一个异常(在C端设置异常标志)然后返回让你没有正常运行的exception.getMessage() .....

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