如何正确实现和使用入参为Book类型的removeBook(Book)方法
解决方案
第一步:为Book类重写equals()和hashCode()方法
Java默认的equals()方法比较的是两个对象的内存地址,如果你希望根据书籍的业务属性(比如书名、ISBN号等)判断两本书是否是同一本,需要在Book类中重写这两个方法,示例如下:
import java.util.Objects; public class Book { private String title; private String isbn; // 其他属性、getter、setter、构造方法省略 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Book book = (Book) o; // 这里可以自定义匹配规则,比如只匹配书名就只写Objects.equals(title, book.title) return Objects.equals(title, book.title) && Objects.equals(isbn, book.isbn); } @Override public int hashCode() { return Objects.hash(title, isbn); } }
第二步:修改removeBook方法
你原来的代码里不需要额外定义id变量,直接用遍历得到的Book对象和入参比较即可,同时要修正“未找到书籍”提示的打印逻辑,避免循环中每遍历一个不匹配的对象就打印一次:
public void removeBook(Book targetBook) { Iterator<Book> it = books.iterator(); boolean isFound = false; while(it.hasNext()) { Book current = it.next(); if(current.equals(targetBook)) { it.remove(); isFound = true; // 如果要求只删除第一个匹配的书籍,这里可以加break; } } if(!isFound) { System.out.println("Book not found"); } }
补充说明
- 如果你不需要自定义匹配规则,能够保证传入
removeBook的Book对象就是ArrayList中存储的同一个对象,也可以不重写equals(),直接用==比较:if(current == targetBook),但这种方式适用场景非常有限,更推荐重写equals()的方案。 - 如果业务要求删除所有匹配的书籍,不需要在删除后加
break,如果只需要删除第一个匹配的,删除后加break跳出循环即可提升效率。
内容的提问来源于stack exchange,提问作者Tom Milton
相关产品推荐
相关产品推荐

