尝试使用列表迭代器删除对象

shr*_*pah 3 java listiterator

我正在尝试使用列表迭代器从列表中删除对象.我已经浏览了网站上的其他解决方案,并没有减轻错误"线程中的异常"主"java.util.ConcurrentModificationException"

这是我的代码没有执行:

void PatronReturn(String bookName) {
//       get to beginning
    while(listIterator.hasPrevious()) {
        listIterator.previous();
    }
    while(listIterator.hasNext()){
        Book b = listIterator.next();
    if (listIterator.next().getBookTitle().equals(bookName)) { 
        //listIterator.next();
        //listIterator.remove();
        books.remove(b);
        //listIterator.next(); //moves to next so iterator can remove previous ?
        //books.remove(listIterator.next());; // TODO see if this is correct

    }
    }
Run Code Online (Sandbox Code Playgroud)

Dun*_*nes 11

  1. 不要直接从列表中删除项目.remove()在迭代器中使用该方法.

  2. 您的代码也存在缺陷,因为它假定还有其他列表项:

    while(listIterator.hasNext()){
        Book b = listIterator.next();
        if (listIterator.next().getBookTitle().equals(bookName)) { 
          // eek
    
    Run Code Online (Sandbox Code Playgroud)

    你打电话next()两次,但你只打了hasNext一次电话.也许你的意思是:

    while(listIterator.hasNext()){
        Book b = listIterator.next();
        if (b.getBookTitle().equals(bookName)) { 
          // ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最后,您可以替换:

    while(listIterator.hasPrevious()) {
        listIterator.previous();
    }
    
    Run Code Online (Sandbox Code Playgroud)

    listIterator = books.listIterator();
    
    Run Code Online (Sandbox Code Playgroud)


duf*_*356 5

而不是books.remove(b)

使用

listIterator.remove();
Run Code Online (Sandbox Code Playgroud)

原因是,迭代器为你提供了下一本()书,如果你只从书中删除这本书,那么迭代器的"已删除"书仍然是下一本书.

它在你的代码中不起作用,因为你调用.next()两次,一次是针对书b,第二次是将书名与下一本书进行比较.