Удаление во время итерации в Java! но удаляя другой, чем текущий объект - PullRequest
1 голос
/ 18 марта 2011

iterator.remove(). хорошо, однако, мой вопрос: если я хочу выполнить итерацию, для какого-то условия, чтобы удалить другой объект из массива List.

Пример (al arraylist)

  for (Iterator i = al.iterator(); i.hasNext(); ){
 IEvent event =(IEvent) i.next();
   if (nbSendingWTS > 0 || nbSendingCTS > 0){
                    i.remove();
                    al.remove(swtsee);
                    al.remove(sdctsee);
                    System.out.println("dropping evtg");
                }

Это дает мне ошибку: исключение в потоке "main" java.util.ConcurrentModificationException

Также нормальная итерация:

          for(IEVEnt event:al){} 

дает ошибку

Для большей ясности swtsee ad sdctsee взяты из предыдущих итераций массива и сохранены, чтобы я мог удалить, если у меня появилось новое условие.Так есть ли способ, когда я обнаруживаю их, чтобы сдвинуть их к более высоким индексам, а затем я использую обратную итерацию?

Что делать?

Ответы [ 4 ]

1 голос
/ 18 марта 2011

Для справки Коллекции Java

ваш код должен работать нормально, комментируя следующие строки

for (Iterator i = al.iterator(); i.hasNext(); )
{
    IEvent event =(IEvent) i.next();
   if (nbSendingWTS > 0 || nbSendingCTS > 0)
   {
          // You have got the iterator for the underlying array list(al)
          **only remove the elements through iterator.**   
          i.remove();

          // after remove thru iterator 
          // you are structurally modifiying arraylist directly(al.remove()) 
          // which gives u concurrent modification
          // al.remove(swtsee);  
          // al.remove(sdctsee);
          System.out.println("dropping evtg");
   }
}

, и лучший способ сделать это

 List<Integer> l = new ArrayList<Integer>();
    List<Integer> itemsToRemove = new ArrayList<Integer>();
    for (int i=0; i < 10; ++i) {
    l.add(new Integer(1));
    l.add(new Integer(2));
    }
    for (Integer i : l)
    {
        if (i.intValue() == 2)
            itemsToRemove.add(i);
    }

    l.removeAll(itemsToRemove);
    System.out.println(l);
1 голос
/ 18 марта 2011

Вы не можете удалить элемент, как вы обсуждали.

Не удалять во время итерации.

  • Оставьте Hash для всех объектов, которые вы хотите delete.
  • Выполните вторую итерацию, которая удаляет, используя .remove(), если объект находится в Hash.
1 голос
/ 18 марта 2011

Чтобы удалить с помощью итератора, вы собираете свои вещи в новую коллекцию и удаляете на последнем этапе, например:

    // list := List (1, 2, 4, 3, 4, 9, 6, 5, 7, 8);
List <Integer> toRemove = new ArrayList <Integer> ();       
for (int i : list)
    if (i % 2 == 0) 
        toRemove.add (i);
list.removeAll (toRemove);

Я не вижу, как a1 подключен к вашемуi.Пока это не повторяется, должно быть безопасно вызывать эти 2 a1.remove (...) -ings во время итерации.

1 голос
/ 18 марта 2011

Невозможно удалить, если вы используете для каждого стиля или итератора.

Использовать обычный цикл, как показано ниже

for(int i=0; i<al.size ; i++){
   if(something){
      al.remove(i)  
      i--;
    }

}

Это будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...