#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. Да. Я тоже думаю, что это уникальный способ. Я приму ваш ответ через минуту. Если существует другой способ (без создания новой переменной или клонирования), мы будем рады. Но только для работы, которая уже стала лучше, чем раньше. хехе, спасибо