Сохранение ссылки на итератор

68
10

У меня есть Связанный список, который содержит контактную информацию (имя, дата рождения и т.д.). Я добавляю контакты в список в список. Я хочу использовать итератор для просмотра списка, чтобы получить доступ ко всей информации о контактах. Здесь у меня проблема. Я использую кнопку "Далее" для доступа ко всей информации о контактах, но я делаю это с использованием индексов, которые увеличиваются каждый раз, когда я нажимаю "Далее". Я не хочу делать это с помощью приращений, а скорее с помощью итератора. Когда я использую итератор, я пытаюсь сохранить ссылку, но я думаю, что делаю это неправильно.

btnNext.addActionListener(new ActionListener() {

private ContactList save;

public void actionPerformed(ActionEvent arg0) {

Iterator<ContactList> iterator = list.iterator();

if(iterator.hasNext())
{
save = itr.next();
name.setText(save.firstName);
lastName.setText(save.lastName);
dob.setText(save.dob);
homeNum.setText(save.homeNum);
cellNum.setText(save.cellNum);
}
}
}};

Я знаю, что этот код получает только первый контакт из списка. Я хочу, чтобы код получил следующий контакт, если кнопка нажата, но я знаю, что, поскольку итератор находится в обработке действий, он не сохраняет itr.next(), если я пытаюсь переместить итератор и поместить его с другими полями я получаю ConcurrentModualError. Любая помощь будет оценена по достоинству.

спросил(а) 2020-04-04T00:31:00+03:00 3 месяца назад
1
Решение
85

Вы близки, но вы фактически не сохраняете итератор.

btnNext.addActionListener(new ActionListener() {

// save the iterator, not the list item
private Iterator<ContactList> iterator;

public void actionPerformed(ActionEvent arg0) {

if(iterator == null){
iterator = list.iterator();
}

if(iterator.hasNext())
{
ContactList save = iterator.next(); // first time itr is mentioned, assume you mean iterator
name.setText(save.firstName);
lastName.setText(save.lastName);
dob.setText(save.dob);
homeNum.setText(save.homeNum);
cellNum.setText(save.cellNum);
}
}
}};

Трудная часть здесь заключается в том, что каждый вызов list.iterator() получает новый итератор, поэтому ваш код начинался с самого начала каждый раз. Вы хотите, чтобы ваш ActionListener сохранил Iterator при первом его получении, а затем продолжайте использовать его каждый раз после этого.

ответил(а) 2020-04-04T00:48:10.421150+03:00 3 месяца назад
39

Ваша ошибка на самом деле является ConcurrentModificationException. С LinkedList вы не можете перебирать его с помощью Iterator в то же время, когда в него вносятся изменения. Сохраняя многолетний Итератор, вы в основном гарантируете, что это произойдет. Самый простой подход состоял бы в том, чтобы сохранить индекс списка, который вы просматриваете в данный момент, и заставить ваши кнопки изменять индекс.

ответил(а) 2020-04-04T00:31:00+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема