2011-08-24 3 views
0
@Override 

    public boolean onTouchEvent(MotionEvent event) 
     { 

     if (System.currentTimeMillis() - lastClick > 300) 
       { 

       lastClick = System.currentTimeMillis(); 

       synchronized (getHolder()) { 

        for (int i = sprites.size() - 1; i >= 0; i--) <-------why in reverse? 
         { 

         Sprite sprite = sprites.get(i); 

         if (sprite.isCollition(event.getX(), event.getY())) 
           { 

           sprites.remove(sprite); 

           break; 

         } 

        } 

       } 

하지만 lastone부터 firstone까지 반복 할 때 결과가 달라집니다. 도움이 필요합니다정상적인 방법으로 처음 1 시부 터 마지막 ​​1 시부 터 시작될 때 반복 오류가 발생합니다.

답변

0

왜냐하면 for 루프 내부에서 스프라이트를 제거하기 때문입니다. 앞으로 나아갈 때 루프의 객체 수를 변경하면 반복 작업이 지연됩니다. 현재 요소를 제거하면이 요소 다음에있는 목록에서 발견 된 모든 요소 (이제까지 열거해야 함)가 색인 아래로 이동합니다. 즉, 색인 i+1에 있었던 요소가 이제 색인 i에 있습니다.

루프에서 제거하는 경우 반복하는 것이 올바른 방법은 발견 한 것처럼 역순으로 반복하는 것입니다. 이렇게하면 현재 요소를 제거 할 때 여전히 열거 할 다른 모든 요소가 여전히 같은 인덱스에 있습니다.

+0

그것은 규칙입니다 ...? 나는 반대로 반복합니다 ..... plz는 그것을 분명히 설명합니다 ........ – sanjay

+0

예, 많은 언어로 규정되어 있습니다. 더 자세히 설명 할 수 있도록 답변을 업데이트했습니다. – link664

관련 문제