2016-04-10 5 views
1

Мне было интересно, возможно ли это, и если да, то как я могу это сделать? В основном, что я видел, и думаю, проблема в том, что курсор итератора перемещается, когда я использую функцию добавления (я не понимаю итерацию отлично, поэтому я не знаю, является ли это проблемой). Проблема возникает, когда я удаляю один элемент, а затем добавляю еще два (это конкретный случай, когда я нашел проблему).Изменение списка во время итерации по нему и итерации по новым элементам

Мой код-то вроде этого:

List<String> list =new ArrayList<>(); 
for (ListIterator<String> iterator = list.listIterator(); iterator.hasNext();) 
     //here i am adding and removing elements 
+0

Является ли эта Java? Это помогает, если вы расскажете людям, какой язык вы используете. Они различаются. –

+0

В любом случае, ответ - нет, вы не можете, и вам не нужно. Итерации над копией. Не знаю, как вы это делаете на Java, но я уверен, что вы найдете здесь десятки примеров здесь. –

+0

Извините, я забыл написать, что это java, в любом случае спасибо за ответ, но я не могу этого сделать, потому что условия добавления элементов зависят от элементов, которые я добавил ранее. – user18497

ответ

0

ListIterator По JLS

Итератор для списков, который позволяет программисту пересекать список в любом направлении, изменить список во время итерации и получить текущее положение итератора в списке. A ListIterator не имеет текущего элемента ; его позиция курсора всегда находится между элементом, который будет возвращен вызовом previous(), и элемент, который будет возвращен , вызовом next(). Итератора для списка длины п имеет п + 1 возможные позиции курсора, как показано на CARETS (^) ниже:

enter image description here

Вы можете использовать Add(), удалить() метод для внесения изменений в итератор и то же будет отражен в ссылке на список.


Удалить в соответствии с JLS

Удаляет из списка последний элемент, который был возвращен к следующему() или предыдущей() (дополнительная работа). Этот вызов может быть сделан только один раз за , для вызова следующего или предыдущего. Это можно сделать, только если add (E) не был , вызванным после последнего вызова следующего или предыдущего.

Так что, если вы используете удалить дважды без вызова следующей() или предыдущей() он будет бросать java.lang.IllegalStateException
Я изменил код, чтобы проверить добавить() и удалить()

public static void main(String[] args) { 

    List<String> list =new ArrayList<>(); 
    list.add("55"); 
    list.add("155"); 
    list.add("255"); 
    for (ListIterator<String> iterator = list.listIterator(); iterator.hasNext();){ 

     System.out.println(list.size()); 
     iterator.add("88"); 
     System.out.println(list.size()); 
     iterator.next(); 
     System.out.println(list.size()); 
     iterator.remove(); 
     System.out.println("first remove done"); 
     iterator.remove(); // will throw exception if previous or next is not called 
    } 

    System.out.println(list); 
}