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