2009-09-28 4 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 не Thread, который создал

java.util.List<Polygon> triangles

используя что-то по заказу Thread ID или, например, именование потоков, а затем выбрасывает из глубины JVM исключение (устанавливает флаг исключения на стороне C), а затем возвращает вас без каких-либо функционирующих исключений.getMessage() .....

Вы может реализовать семантику копирования, и исходная версия будет работать, немного перекручивает ваш мозг, но работает.

+1

О чем ты говоришь? –

+0

это довольно глубоко, у меня не было надежной надежности, пытаясь ответить на них, но то, что я пытался сказать, было для читателя, чтобы отметить, что «Concurrent Modification Exception» не было реализовано, как я думал, вместо того, чтобы обнаруживать два потока, из которых один делает remove(), что было сделано, чтобы установить флаг исключения в jvm исключительно на том основании, что поток, пытающийся удалить(), не был потоком, который создал java.uti.Collection. Кнопка, работающая из потока системных событий, не может быть изменена, даже если наблюдалась семантика синхронизации. –

Смежные вопросы