Java ArrayList添加图书时如何校验重复ISBN实现去重提示
实现添加图书时的ISBN重复校验
你现在直接调用books.add()往集合里塞对象的方式没有前置校验逻辑,只要把添加操作封装成BookRepository的专用公共方法,加一层遍历判断就可以实现重复拦截,不需要修改现有Book类的代码。
具体实现逻辑
- 保持
books集合的私有属性,不要对外暴露集合的直接操作权限,所有添加图书的动作都走统一的封装方法 - 方法接收待添加的Book对象作为入参,先遍历集合内所有已存图书,通过已有的
getIsbn()方法比对ISBN是否和待添加图书重复 - 一旦查到重复ISBN,直接输出提示、终止添加流程;遍历完所有存书都没发现重复的话,再执行add操作
代码示例
修改后的BookRepository类如下:
public class BookRepository { private ArrayList<Book> books = new ArrayList<>(); public BookRepository() { // 初始化数据也走统一的添加方法,保证逻辑一致 addBook(new Book("1", "To Kill a Mockingbird", "Harper Lee", "Fiction", 1960, 4, 0)); } /** * 新增馆藏图书 * @param book 待入库图书对象 * @return 添加结果:true=入库成功,false=ISBN重复入库失败 */ public boolean addBook(Book book) { // 遍历已有馆藏校验ISBN重复 for (Book storedBook : books) { // 如果业务允许ISBN为空,记得先判断storedBook.getIsbn()非空,避免空指针 if (storedBook.getIsbn().equals(book.getIsbn())) { // 提示逻辑可以根据你的项目场景替换:控制台程序就打印文本,Web项目就返回错误信息,GUI程序就弹提示框 System.out.printf("操作失败:ISBN为%s的图书已存在,无需重复添加%n", book.getIsbn()); return false; } } // 校验通过才执行入库 books.add(book); return true; } // 其余查询、删除、借阅相关的仓储方法可以继续往下补充 }
后续要加书的时候,不要直接操作books.add(),统一调用addBook()方法就行,测试示例:
BookRepository repo = new BookRepository(); Book duplicateBook = new Book("1", "重复测试书", "测试作者", "测试分类", 2024, 2, 0); boolean addResult = repo.addBook(duplicateBook); // 控制台会打印「操作失败:ISBN为1的图书已存在,无需重复添加」,addResult返回值为false
性能优化建议
如果你的馆藏图书量级很大,每次遍历ArrayList的O(n)效率会变差,可以做两个调整:
- 额外维护一个
HashSet<String>存储已入库的ISBN,添加前先查Set,判断重复的时间复杂度可以降到O(1),只要保证新增、删除图书时Set和List的数据同步即可 - 也可以直接把存储结构换成
HashMap<String, Book>,用ISBN作为key,Book对象作为value,天然支持唯一键校验,不用自己写遍历逻辑
内容的提问来源于stack exchange,提问作者nockynock
相关产品推荐
相关产品推荐

