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

Java 无法从数组列表中删除元素,java,arrays,arraylist,Java,Arrays,Arraylist,一些背景:我是Java新手,正在学习一门基本的Java课程。我目前正在完成课程的最后一个项目,除了最后一段代码之外,我完成了所有的工作。由于某些原因,我在从数组列表中删除元素时遇到了最困难的情况。以下是我正在编写的代码: public static void delete(String bookID) { for (book eachElement : catalog) { if (eachElement.getBookID().equals(bookID)) {

一些背景:我是Java新手,正在学习一门基本的Java课程。我目前正在完成课程的最后一个项目,除了最后一段代码之外,我完成了所有的工作。由于某些原因,我在从数组列表中删除元素时遇到了最困难的情况。以下是我正在编写的代码:

public static void delete(String bookID) {
    for (book eachElement : catalog) {
        if (eachElement.getBookID().equals(bookID)) {
            catalog.remove(eachElement);
            return;
        }
    }
}
代码执行,没有运行时错误,但不会删除任何内容。
另外,我知道在remove语句之前一切都能正常工作,因为我有另一个方法,它使用相同的for和if语句和selectbookid字符串来计算。

您需要使用迭代器,否则您将得到


注意:出于性能考虑(每一步的二次内存使用和线性删除),我不推荐最后一种方法。我给出这个示例只是为了强调抛出
java.util.ConcurrentModificationException
的根本原因。

您需要使用迭代器,否则您将得到


注意:出于性能考虑(每一步的二次内存使用和线性删除),我不推荐最后一种方法。我给出这个示例只是为了强调抛出
java.util.ConcurrentModificationException
的根本原因。

在forEach循环中,不应该也不能从集合中删除元素

请阅读Java中ArrayList的文档

在这里您可以看到,ArrayList.remove(Object o)在列表中删除了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);

在forEach循环中,不应该也不能从集合中删除元素

请阅读Java中ArrayList的文档

在这里您可以看到,ArrayList.remove(Object o)在列表中删除了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);

在使用循环时,您需要使用迭代器来删除项。
还要仔细检查id是否存在(做一些System.out.println(“测试”)并检查它是否正在进入范围)。

在使用循环时,您需要使用迭代器来删除项。
还要仔细检查id是否存在(制作一些System.out.println(“测试”)并检查它是否正在进入范围)。

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

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

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

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


它不会删除任何内容-可能是因为没有带有arg bookId的元素?您应该检查您的bookId是否真的等于列表中的一个id,包括case等。为此,请使用调试器。但一旦你这样做了,你会得到一个并发更新异常,因为你应该只能在迭代列表时从列表中删除,如果你使用该列表的迭代器(显式)。检查@realponsign他应该没问题,因为它
在删除它后返回
(尽管这不是一个好的做法)。由于这是一个静态方法,这意味着您的
目录
也是静态的,您确定它没有在代码中的其他地方更新吗?它不会删除任何内容-可能是因为没有带有arg bookId的元素?您应该检查您的bookId是否真的等于列表中的一个ID,包括case等。为此使用调试器。但一旦你这样做了,你会得到一个并发更新异常,因为你应该只能在迭代列表时从列表中删除,如果你使用该列表的迭代器(显式)。检查@realponsign他应该没问题,因为它
在删除它后返回
(尽管这不是一个好的做法)。由于这是一个静态方法,这意味着您的
目录
也是静态的,您确定它没有在代码中的其他地方更新吗?@realpointist sry my bad,修复了它。顺便说一句,好名字:DGood。所以现在没有逻辑问题了。但是您仍然在重复列表两次,这是不必要的。@realpoint我不是,删除是第二个正确的,但是没有其他方法,除非您按索引删除,但是这也不是更好的方法。使用此数据存储类型和参数。这就是为什么我建议使用Map,甚至Set和use Book参数来代替字符串的原因。不,可以使用迭代器删除。参见Zgurskyi的答案。我喜欢流式答案+1@RealSkeptic对不起,修好了。顺便说一句,好名字:DGood。所以现在没有逻辑问题了。但是您仍然在重复列表两次,这是不必要的。@realpoint我不是,删除是第二个正确的,但是没有其他方法,除非您按索引删除,但是这也不是更好的方法。使用此数据存储类型和参数。这就是为什么我建议使用Map,甚至Set和use Book参数来代替字符串的原因。不,可以使用迭代器删除。请参阅Zgurskyi的答案。我喜欢流答案+1。没有必要对重复项使用不同的逻辑。只需从第一个循环中删除
return
,它将删除所有重复项,而无需重复列表两次。是的,您是对的。不需要对重复项使用不同的逻辑。只需从第一个循环中删除
return
,它将删除所有重复项,而无需重复列表两次。是的,您是对的。很好,但由于OP在删除元素后返回,如果列表包含重复项,则逻辑不同。很好,但由于OP在删除元素后返回,如果列表包含重复项,则逻辑不同。