【问题标题】:Trying to remove an object with list iterator尝试使用列表迭代器删除对象
【发布时间】:2013-04-18 13:27:12
【问题描述】:

我正在尝试使用列表迭代器从列表中删除一个对象。我已经浏览了网站上的其他解决方案,但都没有缓解错误“线程“main”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

    }
    }

【问题讨论】:

  • 为什么使用 hasPrevious()
  • PSR 我使用 has.previous() 到达列表的开头,以确保在添加或删除后从头开始
  • 有些奇怪...您拨打Book b = listIterator.next();,然后在下一行您不使用b,但再次拨打listIterator.next()。这看起来很奇怪......

标签: java listiterator


【解决方案1】:
  1. 不要直接从列表中删除项目。在迭代器中使用remove() 方法。

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

    while(listIterator.hasNext()){
        Book b = listIterator.next();
        if (listIterator.next().getBookTitle().equals(bookName)) { 
          // eek
    

    在这里你调用了两次next(),但你只调用了一次hasNext。也许你的意思是:

    while(listIterator.hasNext()){
        Book b = listIterator.next();
        if (b.getBookTitle().equals(bookName)) { 
          // ...
    
  3. 最后,你可以替换:

    while(listIterator.hasPrevious()) {
        listIterator.previous();
    }
    

    listIterator = books.listIterator();
    

【讨论】:

  • 这是最安全的方法。 +1
  • 这也不起作用,正如您在我的注释代码中看到的那样,我已经尝试过了。
  • @user2236278 我怀疑你还有其他错误,与我上面的第二点有关。
  • 上述两种sn-ps的代码组合解决了我的问题。 Java 不喜欢以我以前的方式将 Iterator 设置在列表的前面,而且,正如您指出的那样,我调用了 next 两次。非常感谢。
【解决方案2】:

而不是 books.remove(b)

使用

listIterator.remove();

原因是,迭代器给你 next() 书,如果你只从书中删除这本书,迭代器将“删除”的书仍然作为下一本书。

它在您的代码中不起作用,因为您调用了 .next() 两次,一次用于书 b,第二次用于比较书名和下一本书。

【讨论】:

    【解决方案3】:

    而不是books.remove(b)

    尝试使用

       listIterator.remove();
    

    【讨论】:

      【解决方案4】:

      您不能在迭代时从 ArrayList 中删除项目。

      你可以:

      • 使用ListIterator 的remove() 方法(每个next() 最多一次)
      • 使用另一个List 实现,例如CopyOnWriteArrayList,保证永远不会抛出ConcurrentModificationException,但在您的情况下这可能有点矫枉过正。

      【讨论】:

        【解决方案5】:

        您不能在迭代列表时删除项目,您应该使用 .remove()

        也删除这个:

        while(listIterator.hasPrevious()) {
            listIterator.previous();
        }
        

        这不是必须的

        【讨论】:

          【解决方案6】:
          {   Book toBeReaplced = null; Book tempBook = null;   
          void PatronReturn(String bookName)           
          {//       get to beginning
          while(listIterator.hasPrevious()) {        listIterator.previous();
          }
          while(listIterator.hasNext()){
              Book tempBook = listIterator.next();
          if (b.getBookTitle().equals(bookName)) { 
                       toBeReaplced = tempBook;
          
          }
          
          listIterator.remove(bookToBeReplaced);
          }
          

          你可以试试上面的代码。我认为它能够解决您的问题,即您遇到了 java.util.ConcurrentModificationException" 错误。有关该错误的更多参考,请关注link

          【讨论】:

            猜你喜欢
            • 2016-12-02
            • 2019-02-12
            • 2017-02-10
            • 2012-04-01
            • 1970-01-01
            • 2019-06-06
            • 2015-10-05
            • 1970-01-01
            • 2016-01-02
            相关资源
            最近更新 更多