Java:使用迭代器删除所有对象

Java:使用迭代器删除所有对象,java,foreach,while-loop,iterator,Java,Foreach,While Loop,Iterator,我正在创建一个Library类,它将类书的对象存储在ArrayList集合中。我有大部分的功能,但我想删除函数,删除一个参数(名称)的所有对象时,调用。到目前为止,我所做的函数似乎只删除它遇到的第一个元素,然后停止执行 我的库类如下所示(添加对象的代码被省略): import java.util.ArrayList; 导入java.util.Iterator; 公共班级图书馆{ 私人收藏; 私人书籍; 公共图书馆(){ collection=newarraylist(); } 公共图书搜索簿(字

我正在创建一个Library类,它将类书的对象存储在ArrayList集合中。我有大部分的功能,但我想删除函数,删除一个参数(名称)的所有对象时,调用。到目前为止,我所做的函数似乎只删除它遇到的第一个元素,然后停止执行

我的库类如下所示(添加对象的代码被省略):

import java.util.ArrayList;
导入java.util.Iterator;
公共班级图书馆{
私人收藏;
私人书籍;
公共图书馆(){
collection=newarraylist();
}
公共图书搜索簿(字符串搜索簿){
Book bookB=null;
Iterator it=collection.Iterator();
布尔值=false;
while(it.hasNext()&&!found){
bookB=it.next();
字符串b=book.getBookName();
如果(b.equals(searchBook)){
发现=真;
}
}
如果(找到){
还书B;
}
否则{
返回null;
}
}
public void removeBook(字符串搜索簿){
if(findBook(searchBook)!=null&&bookname.equals(searchBook)){
Book b=findBook(搜索簿);
System.out.println(“删除”+b.getBookName());
收集。删除(b);
}
否则{
System.out.println(“别担心,反正我们没有这个”);
}
}
}

我的一个朋友告诉我做一个foreach循环来包装removeBook中的if/else,但到目前为止我还没有成功,因为老实说,我不知道如何实现它


非常感谢您的任何帮助、见解或反馈。

您可能需要类似的帮助

Book b = findBook(searchBook);
while(b != null) {
    collection.remove(b);
    b = findBook(searchBook);
    ...
 }

您需要迭代列表的所有元素,然后检查是否有与作为removeBook方法的参数传入的图书名称相等的图书名称,如果找到这样的条目,则通过迭代器的remove方法将其删除。所以代码应该是这样的:

Iterator<Book> it = collection.iterator();
Book book;
while (it.hasNext()) {
    book = it.next();
    if (book.getBookName().equals(searchBook)) {
        it.remove();
    }
}
Iterator it=collection.Iterator();
书籍;
while(it.hasNext()){
book=it.next();
if(book.getBookName().equals(searchBook)){
it.remove();
}
}
findBook(searchBook)方法中的
while(it.hasNext()&&&!found)
在找到作为参数传递的名称的书籍后停止。并返回该
书籍
。这就是为什么只有一个名为
的对象被删除的原因。更改代码以返回具有该名称的所有对象的
列表。只需检查返回类型
booksFound
,如果其中包含图书,如
booksFound.Size>0
。然后迭代列表并删除它们

public List<Book> findBook(String searchBook) {

Book bookB = null;
Iterator<Book> it = collection.iterator();
List<Book> booksFound = new ArrayList<Book>();

while (it.hasNext()) {
    bookB = it.next();
    String b = book.getBookName();

    if (b.equals(searchBook)) {
        booksFound.add(b);
    }
}
return booksFound;
}
公共列表findBook(字符串搜索簿){
Book bookB=null;
Iterator it=collection.Iterator();
List booksFound=new ArrayList();
while(it.hasNext()){
bookB=it.next();
字符串b=book.getBookName();
如果(b.equals(searchBook)){
添加(b);
}
}
发现退货;
}
以及删除方法:

public void removeBook (String searchBook) { 

List<Books> booksFound = findBook(searchBook);
if(booksFound.size() > 0) {
   for (Book book: booksFound) {
      collection.remove(book);
   }
}
else {
    System.out.println("Don't worry, we don't have that one anyways");
}
}
public void removeBook(字符串搜索簿){
List booksFound=findBook(searchBook);
如果(booksFound.size()>0){
for(图书:booksFound){
收藏。移走(书);
}
}
否则{
System.out.println(“别担心,反正我们没有这个”);
}
}

您在寻找吗?是的,我需要迭代集合中的所有对象,然后删除每个具有相同名称(字符串)的对象。我尝试了该函数并编译了它,但当我尝试执行时,它返回java.langNullPointerException:null in String b=book.getBookName();您可能正在将空对象插入列表的某个位置。因为您总是在执行book=it.next()之前测试它。hasNext(),所以book总是列表中的某个元素。在提取其名称之前,您可以测试它是否为null,但这并不好,最好是您知道在您的代码中,null book被插入列表的位置。似乎非常复杂,我必须做这么多更改才能应用这样一个(相对)小的功能。我是java的完全初学者,当然会听取这里给出的任何建议,但这难道不应该更容易吗?注意:我尝试了top comment的解决方案,效果非常好。使用像您所描述的列表与常规对象迭代相比有什么优势吗?在编程中,代码的简单性和灵活性始终是平衡的。上面的代码看起来可能更长或更复杂,但如果您将来必须进行更改,则非常灵活。对于应用程序中的不同任务,可以使用
findBook(arg)
方法。如果将此程序限制为一个特定任务,则需要编写另一个方法。因此,您将一次又一次地编写相同的方法,这是多余的,并且会使代码维护变得困难。编码时,请始终考虑程序的未来用途。这样就很容易扩展和维护代码。
public void removeBook (String searchBook) { 

List<Books> booksFound = findBook(searchBook);
if(booksFound.size() > 0) {
   for (Book book: booksFound) {
      collection.remove(book);
   }
}
else {
    System.out.println("Don't worry, we don't have that one anyways");
}
}