2011-07-26 9 views
0

私は連絡先情報(名前、生年月日など)を保持するリンクリストを持っています。リスト内の連絡先をリストに追加します。イテレータを使用してリストを参照して、すべての連絡先の情報にアクセスできるようにしたいと思います。これは私が問題を抱えているところです。 次のボタンを使用してすべての連絡先の情報にアクセスしますが、[次へ]を押すたびに増分するインデックスを使用しています。私はインクリメントを使用するのではなく、イテレータを使用してそれをやりたいイテレーターを使用すると参照を保存しようとしますが、私は間違っていると思います。イテレータリファレンスの保存

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); 
      } 
} 
}}; 

私はこのコードがリストから最初の連絡先だけを取得することを知っています。ボタンが押されても次の連絡先を取得するコードが必要ですが、iteratorが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()へのすべての呼び出しは、新しいイテレータを取得するということです。初めてにIteratorを保存してから、それ以降毎回使用するようにしてください。

+0

ありがとう、これは私が探していたものです。説明をありがとう、それは理にかなっています。 – Jazzy

0

実際には、エラーはConcurrentModificationExceptionです。 LinkedListを使用すると、変更が行われているのと同時にIteratorで反復処理することはできません。このようにIteratorを長期間保存することによって、基本的にはそれが起こることを保証しています。最も簡単な方法は、現在表示しているリストのインデックスを保存し、ボタンでインデックスを変更することだけです。