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

Java向ArrayList添加含多参数的书籍及查询、遍历功能实现问题

解决思路

你代码的核心问题是没有封装书籍实体,把单本书的三个属性作为独立字符串存入ArrayList<String>,自然无法关联同一本书的作者、标题、编号信息。可以按以下步骤修改:

1. 新建Book类封装书籍属性

public class Book {
    // 封装书籍三个核心属性
    private String author;
    private String title;
    private String id;
    // 构造方法
    public Book(String author, String title, String id) {
        this.author = author;
        this.title = title;
        this.id = id;
    }
    // Getter方法,用于外部读取属性
    public String getAuthor() { return author; }
    public String getTitle() { return title; }
    public String getId() { return id; }
    // 重写toString方法,方便直接打印书籍信息
    @Override
    public String toString() {
        return "书籍编号:" + id + ",标题:" + title + ",作者:" + author;
    }
}

2. 修改Library类的核心逻辑

核心修改点:

  • 将存储书籍的ArrayList泛型从String改为Book,集合中每个元素就是一本完整的书,所有属性天然关联
  • 修复addBook方法,直接存入Book对象而非拆分的字符串
  • 修复getMatchingBooks的逻辑bug:删除if后的多余分号,将结果集合改为方法内局部变量避免多次查询结果累积,匹配标题后返回完整的Book对象
  • 字符串比较统一使用equals(),不要用==

修改后的Library类示例:

import java.util.ArrayList;
import java.util.Iterator;

public class Library {
    // 泛型改为Book,存储完整书籍对象
    private ArrayList<Book> books;
    private String name;

    public Library(String aName) {
        books = new ArrayList<>();
        name = aName;
    }

    // 添加书籍时直接实例化Book对象存入集合
    public void addBook(String author, String title, String id) {
        books.add(new Book(author, title, id));
    }

    public double calculateFine (double bookPrice, int dayLate) {
        return (bookPrice / 50) * dayLate;
    }

    // 按标题匹配书籍,返回匹配到的完整书籍集合
    public ArrayList<Book> getMatchingBooks(String bookMatch) {
        // 结果集合改为局部变量,每次查询新建避免结果累积
        ArrayList<Book> matchedBooks = new ArrayList<>();
        for (Book book : books) {
            // 字符串用equals比较,删除原来if后的多余分号
            if (book.getTitle().equals(bookMatch)) {
                matchedBooks.add(book);
            }
        }
        return matchedBooks;
    }

    // 列出所有书籍
    public void listAllBooks() {
        for (Book book : books) {
            // 因为Book重写了toString,直接打印即可输出完整信息
            System.out.println(book);
        }
    }

    // 这里给出removeBook的正确实现例子,避免并发修改异常
    public void removeBook(String targetId) {
        Iterator<Book> iterator = books.iterator();
        boolean found = false;
        while (iterator.hasNext()) {
            Book book = iterator.next();
            // 按编号删除更准确,避免重名书籍误删
            if (book.getId().equals(targetId)) {
                iterator.remove();
                found = true;
                System.out.println("书籍删除成功");
                break;
            }
        }
        if (!found) {
            System.out.println("Book not found");
        }
    }

    // 剩余isAvailable、loanBook等方法可参考上面的逻辑基于Book对象属性自行修改
}

额外注意的原有代码bug

  • 原有getMatchingBooks方法中if判断后多了分号,导致判断逻辑完全失效,无论是否匹配都会把查询字符串加入结果集合
  • 原有代码中多次使用==比较字符串内容,这是错误写法,Java中字符串内容比较必须用equals()方法
  • 原有booksClone定义为全局成员变量,会导致每次查询的结果都累积到同一个集合里,返回结果错误,必须改为方法内局部变量
  • 原有遍历集合时直接调用ArrayList.remove()会触发并发修改异常,使用迭代器删除是更安全的实现方式

内容的提问来源于stack exchange,提问作者user10812253

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:57:00