Хранение ссылки на итератор - PullRequest
0 голосов
/ 26 июля 2011

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

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.Любая помощь будет оценена.

Ответы [ 2 ]

4 голосов
/ 26 июля 2011

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

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 при первом получении, а затем продолжал использовать его каждый раз после этого.

0 голосов
/ 26 июля 2011

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

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