3 回答
TA贡献1856条经验 获得超11个赞
你需要使用迭代器,否则你会得到java.util.ConcurrentModificationException
public static void delete(String bookID) {
for (Iterator<Book> it = catalog.listIterator(); it.hasNext(); ) {
Book book = it.next();
if (book.getBookID().equalsIgnoreCase(bookID)) {
it.remove(book);
return;
}
}
}
注意:equalsIgnoreCase用于丢弃大小写差异。
java.util.ConcurrentModificationException被抛出,因为您正在列表上执行 2 个操作:迭代和删除。所以,实际上,还有另一种方法——在迭代的每一步复制列表。
public static void delete(String bookID) {
for (Book book : new ArrayList<>(catalog)) {
if (book.getBookID().equalsIgnoreCase(bookID)) {
catalog.remove(book);
return;
}
}
}
注意:出于性能考虑(每一步的二次内存使用和线性删除),我不推荐最后一种方法。我给出这个例子只是为了强调抛出的根本原因java.util.ConcurrentModificationException。
TA贡献1796条经验 获得超4个赞
在 forEach 循环中,您不应该也不能从集合中删除元素。
请阅读 Java 中 ArrayList 的文档。
https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
您实际上可以看到,如果 o 在列表中,ArrayList.remove(Object o) 将删除它,因此不需要您的方法。
所以答案是,用你的 ID 找到 book 对象,然后将其删除。或者更好地使用地图来存储您的数据。
在你的情况下,它会是
Book b = null;
for(Book book : books) {
if(book.getBookId().equals(bookId)) {
b = book.getBookId();
break;
}
}
books.remove(b);
或者,如果您喜欢 Java8,那么您真的应该:D
books.stream().filter(b -> b.getBookId().equals(bookId)).getFirst().ifPresent(books::remove);
TA贡献1821条经验 获得超6个赞
在使用迭代器时删除元素是未定义的。更好的方法是使用 removeIf。
catalog.removeIf(eachElement -> eachElement.getBookID().equals(bookId));
添加回答
举报