存储迭代器参考

时间:2011-07-26 03:36:14

标签: java list iterator

我有一个链接列表,其中包含联系信息(姓名,出生日期等)。我将列表中的联系人添加到列表中。我想使用迭代器遍历列表,以便我可以访问所有联系人的信息。这就是我遇到问题的地方。我使用 Next 按钮来访问所有联系人的信息,但我使用的索引会在每次按Next时递增。我不想使用增量,而是使用迭代器。当我使用迭代器时,我尝试保存引用,但我认为我做错了。

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 个答案:

答案 0 :(得分:4)

你很接近,但实际上并没有保存迭代器

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时保存{{1}},然后每次都使用它。

答案 1 :(得分:0)

您的错误实际上是ConcurrentModificationException。使用LinkedList,您无法在对Iterator进行更改的同时使用Iterator进行迭代。通过长期存储Iterator,你基本上可以保证它会发生。最简单的方法是存储您当前正在查看的列表的索引,并使您的按钮更改索引。