You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 02:42:18