Ошибка итерации при запуске с 1-го до последнего, т.е. обычным способом - PullRequest
0 голосов
/ 24 августа 2011
 @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; 

                        } 

                    } 

                }

Но когда я перебираю от последнего до первого, то есть в обратном порядке, это дает результат. Почему? Нужна помощь

1 Ответ

0 голосов
/ 24 августа 2011

Это потому, что вы удаляете спрайты внутри цикла for. Когда вы изменяете количество объектов в цикле при движении вперед, вы заполняете итерацию. Когда вы удаляете текущий элемент, все элементы, найденные в списке после этого элемента (и все еще подлежащие перечислению), теперь смещаются вниз по индексу, то есть элемент, который имел индекс i+1, теперь имеет индекс i.

Если вы удаляете из цикла, через который вы перебираете, правильный путь - перебирать в обратном порядке, как вы узнали. Таким образом, когда вы удаляете текущий элемент, все остальные элементы, которые все еще будут перечислены, будут иметь тот же индекс.

...