我有一个链接列表,其中包含联系信息(姓名,出生日期等)。我将列表中的联系人添加到列表中。我想使用迭代器遍历列表,以便我可以访问所有联系人的信息。这就是我遇到问题的地方。我使用 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。任何帮助将不胜感激。
答案 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,你基本上可以保证它会发生。最简单的方法是存储您当前正在查看的列表的索引,并使您的按钮更改索引。