使用迭代器将对象添加到链接列表

时间:2013-03-20 18:54:56

标签: java iterator linked-list

好的,我试图将一些学生对象添加到链接列表中,但我不允许使用链接列表的.add方法,所以当用户调用removeStudent方法时,他们输入sutdents ID号,然后它检查具有该数组的对象的列表

继承我的代码添加方法:

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

3 个答案:

答案 0 :(得分:3)

ConcurrentModificationException基本上意味着您已经在创建列表迭代器和使用它之间修改了列表。您需要做的是在将所有内容添加到列表后创建并使用迭代器,或者通过任何其他方式对其进行修改。

答案 1 :(得分:0)

编辑:尝试使用本地迭代器:

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

这样,列表和本地迭代器之间没有并发修改。但这会修改​​列表,如果在调用此方法后继续尝试使用以前的迭代器,则可能会遇到问题。

编辑:AbstractList维护一个“modCount”(修改计数)属性,用于计算您在列表中添加,删除等的数量。

当你在List上获得一个迭代器时,迭代器会记住这个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()

答案 2 :(得分: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限制的价格。