无法从数组列表中删除元素

一些背景知识:我是 Java 新手,正在学习基本的 Java 课程。我目前正在进行课程的最后一个项目,并完成了除了最后一段代码之外的所有内容。出于某种原因,我很难从数组列表中删除一个元素。这是我正在处理的代码:


public static void delete(String bookID) {

    for (book eachElement : catalog) {

        if (eachElement.getBookID().equals(bookID)) {

            catalog.remove(eachElement);

            return;

        }

    }

}

代码执行,没有运行时错误,但不会删除任何内容。另外,我知道在 remove 语句之前一切正常,因为我有另一种方法可以使用与 select bookID 字符串相同的 for 和 if 语句来计算计算。



梵蒂冈之花
浏览 135回答 3
3回答

呼唤远方

你需要使用迭代器,否则你会得到java.util.ConcurrentModificationExceptionpublic static void delete(String bookID) {&nbsp; &nbsp; for (Iterator<Book> it = catalog.listIterator(); it.hasNext(); ) {&nbsp; &nbsp; &nbsp; &nbsp; Book book = it.next();&nbsp; &nbsp; &nbsp; &nbsp; if (book.getBookID().equalsIgnoreCase(bookID)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; it.remove(book);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}注意:equalsIgnoreCase用于丢弃大小写差异。java.util.ConcurrentModificationException被抛出,因为您正在列表上执行 2 个操作:迭代和删除。所以,实际上,还有另一种方法——在迭代的每一步复制列表。public static void delete(String bookID) {&nbsp; &nbsp; for (Book book : new ArrayList<>(catalog)) {&nbsp; &nbsp; &nbsp; &nbsp; if (book.getBookID().equalsIgnoreCase(bookID)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; catalog.remove(book);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}注意:出于性能考虑(每一步的二次内存使用和线性删除),我不推荐最后一种方法。我给出这个例子只是为了强调抛出的根本原因java.util.ConcurrentModificationException。

SMILET

在 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) {&nbsp; &nbsp; &nbsp;if(book.getBookId().equals(bookId)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b = book.getBookId();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;&nbsp; &nbsp; &nbsp;}}books.remove(b);或者,如果您喜欢 Java8,那么您真的应该:Dbooks.stream().filter(b -> b.getBookId().equals(bookId)).getFirst().ifPresent(books::remove);

达令说

在使用迭代器时删除元素是未定义的。更好的方法是使用 removeIf。&nbsp;catalog.removeIf(eachElement&nbsp;->&nbsp;eachElement.getBookID().equals(bookId));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java