0

OK , リンク リストに学生オブジェクトを追加しようとしています. しかし, リンク リストの .add メソッドを使用することは許可されていません. したがって, ユーザーが removeStudent メソッドを呼び出すと, 彼らは学生 ID 番号を入力します. 次に, リストをチェックします.その配列を持つオブジェクトの

Addメソッドのコードは次のとおりです。

public void deleteStudent(int studentID)
{
    while (iter.hasNext())
    {
       Student ob = iter.next();
       if (ob.getStudentID() == studentID)
       {
         iter.remove();
         break;
       }
     }
  }

これを実行すると、次のエラーが発生します。

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:953)
    at java.util.LinkedList$ListItr.next(LinkedList.java:886)
    at student.Registry.deleteStudent(Registry.java:30)
    at student.Registry.main(Registry.java:51)
Java Result: 1
4

3 に答える 3

3

ConcurrentModificationException基本的には、リスト反復子を作成してから使用するまでの間にリストを変更したことを意味します。あなたがする必要があるのは、リストにすべてを追加した後、または他の方法でそれを変更した後に、イテレータを作成して使用することです。

于 2013-03-20T19:01:21.273 に答える
0

EDIT:ローカルイテレータを使用してみてください:

public void deleteStudent(int studentID){
  Iterator<Student> iterator=listStudent.iterator();
  while (iter.hasNext()){
    Student ob = iterator.next();
    if (ob.getStudentID() == studentID){
      iterator.remove(student);
      break;
    }
  }
}

このように、リストとローカル イテレータの間で同時に変更が行われることはありません。ただし、これによりリストが変更されるため、このメソッドを呼び出した後に以前の反復子を使用し続けると、おそらく問題が発生します。

EDIT : AbstractList は、リストに対して行った追加、削除などの数をカウントする「modCount」(変更カウント) 属性を維持します。

リストで反復子を取得すると、反復子はこの modCount を記憶して、反復子の外部のメソッドでリストを編集しないようにします。

例:

List myList=new ArrayList();
//modCount for the list is 0

myList.add("test");
//modCount for the list is 1

Iterator iterator=myList.iterator();
//modCount for the list is 1
//expected modCount for the iterator is initialized to 1

myList.add("test 2");
//modCount for the list is 2
//expected modCount for the iterator is initialized to 1

iterator.remove("test");
//modCount != expectedModCount => throw new ConcurrentModificationException()
于 2013-03-20T18:58:11.117 に答える
0

元のタスクは明確ではありませんが、LinkedList API によって制限されているようです。

何もありません。

リンクされたリストでは、要素の削除 (および一般的な変更) は簡単な作業ではありません。リスト全体を安全に反復処理する必要がある場合があります。(リンクされたリストの良いニュースは、挿入が簡単だということです)。

これはうまくいきます(他の方法もあります):

public void deleteStudent(int studentID){
...
  LinkedList<Student> modifiedStudentList = new LinkedList<>();
  while (iter.hasNext()){
    Student ob = iterator.next();
    if (ob.getStudentID() != studentID){
        modifiedStudentList.addLast(ob) 
    }
  }
  studentList = modifiedStudentList;
}

その結果、studentID を持つ学生を除いて、リストには以前にあったすべての学生が含まれます。リストに存在しない場合、何も削除されません。

コレクション内のすべての要素を反復処理する必要がありますが、これは教師が設定した API 制限の価格です。

于 2013-03-20T19:58:16.183 に答える