2011-07-26 88 views
0

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

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。任何帮助,将不胜感激。

回答

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,然后在此后每次都继续使用它。

+0

感谢,这正是我一直在寻找。感谢您的解释,这是有道理的。 – Jazzy

0

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