删除ArrayList对象问题

bab*_*gau 5 java

在处理赋值时,我遇到了从ArrayList中删除对象的问题如果我使用"normal"for循环,它的工作原理如下

public void returnBook(String isbn){        
    for (int i = 0; i < booksBorrowed.size(); i++){            
        if (booksBorrowed.get(i).getISBN() == isbn){
            booksBorrowed.get(i).returnBook();
            booksBorrowed.remove(i);                
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用增强的for循环来简化代码时,这不起作用并显示java.util.ConcurrentModificationException错误:

public void returnBook(String isbn){        
        for (Book book: booksBorrowed){            
            if (book.getISBN() == isbn){
                book.returnBook();
                booksBorrowed.remove(book);                
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

希望你们能帮我一点......

Edw*_*rzo 7

避免ConcurrentModificationException的替代方法是:

List<Book> books = new ArrayList<Book>();
books.add(new Book(new ISBN("0-201-63361-2")));
books.add(new Book(new ISBN("0-201-63361-3")));
books.add(new Book(new ISBN("0-201-63361-4")));
Run Code Online (Sandbox Code Playgroud)

在增强型for循环中收集要删除的所有记录,并在完成迭代后删除所有找到的记录.

ISBN isbn = new ISBN("0-201-63361-2");
List<Book> found = new ArrayList<Book>();
for(Book book : books){
    if(book.getIsbn().equals(isbn)){
        found.add(book);
    }
}
books.removeAll(found);
Run Code Online (Sandbox Code Playgroud)

或者您可以ListIterator在迭代过程中使用支持remove方法的方法.

ListIterator<Book> iter = books.listIterator();
while(iter.hasNext()){
    if(iter.next().getIsbn().equals(isbn)){
        iter.remove();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用像LambdaJ这样的第三方库,它可以在幕后为您完成所有工作>

List<Book> filtered = select(books, 
                having(on(Book.class).getIsbn(), 
                        is(new ISBN("0-201-63361-2"))));
Run Code Online (Sandbox Code Playgroud)