Переместить текущий объект на итераторе в конец списка

#java #iterator #concurrentmodification

#java #итератор #одновременная модификация

Вопрос:

У меня возникла проблема на Java с использованием объекта Iterator (LinkedList.iterator ()). В цикле мне нужно переместить объект итератора из некоторого места в конец списка.

Например:

 final Iterator<Transition> it = this.transitions.iterator();
while(it.hasNext()) {
    final Transition object = it.next();

    if(object.id == 3){
        // Move to end of this.transitions list
        // without throw ConcurrentModificationException
    }
}
  

Я не могу клонировать this.transitions по некоторым причинам. Это возможно, или мне действительно нужно использовать метод clone?

Редактировать: в настоящее время я делаю это:

         it.remove();
        this.transitions.add(object);
  

Но проблема как раз в этой второй строке. Я не могу его добавить, это внутренний итератор того же объекта. 🙁

Комментарии:

1. Вы пробовали это? Я почти уверен, что вы можете изменить this.transitions без каких-либо проблем, потому что вы не зацикливаетесь на нем напрямую, вы используете Iterator , который в основном является клоном this.transitions .

2. Да. it.remove() отлично работает при переносе. Но проблема в добавлении в конец списка с помощью this.transitions.add(object) метода use.

3. О, вы имеете в виду, что когда вы добавляете его в конце, он не появляется в Iterator ?

4. Когда я добавляю в конец списка, он выбрасывает ConcurrentModificationException , потому что this.transition «заблокирован» для изменений.

5. @jonah нет, он имеет в виду, что отказоустойчивое поведение итератора мешает ему делать то, что он хочет

Ответ №1:

вы можете сохранить второй список элементов для добавления:

 final Iterator<Transition> it = this.transitions.iterator();
final List<Transition> tmp = new ArrayList();//using a list will keep the order
while(it.hasNext()) {
    final Transition object = it.next();

    if(object.id == 3){
        it.remove();
        tmp.add(object);
    }
}
this.transitions.addAll(tmp);
  

Комментарии:

1. Да. Я тоже думаю, что это уникальный способ. Я приму ваш ответ через минуту. Если существует другой способ (без создания новой переменной или клонирования), мы будем рады. Но только для работы, которая уже стала лучше, чем раньше. хехе, спасибо