为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

梵蒂冈之花 2022-06-08 17:14:13
一些背景知识:我是 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 语句来计算计算。
查看完整描述

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。


查看完整回答
反对 回复 2022-06-08
?
SMILET

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);



查看完整回答
反对 回复 2022-06-08
?
达令说

TA贡献1821条经验 获得超6个赞

在使用迭代器时删除元素是未定义的。更好的方法是使用 removeIf。

 catalog.removeIf(eachElement -> eachElement.getBookID().equals(bookId));


查看完整回答
反对 回复 2022-06-08
  • 3 回答
  • 0 关注
  • 134 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信