在处理赋值时,我遇到了从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)
希望你们能帮我一点......
避免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)
| 归档时间: |
|
| 查看次数: |
2837 次 |
| 最近记录: |