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
相关产品推荐
相关产品推荐

