2009-09-28 5 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에 설정하는 것입니다. 시스템 이벤트 스레드에서 작동하는 단추는 동기화 의미가 관찰 되더라도 수정할 수 없습니다. –

관련 문제