基于线性搜索与插入算法的Java预约图书程序问题求助
搞定你的线性搜索+插入算法Java程序故障
看起来你在做一个图书管理相关的小Java程序:用线性搜索从图书数组里找出已预约的副本,再用插入算法把它放到新数组的起始位置,结果演示时掉链子了,问题出在你贴的这段代码的最后一行:
package javaapplicationadt2; public class Books { public String ISBN; // class properties publi...
先给你拆解问题,一步步来解决:
1. 先把Books类的语法坑填上
你贴的代码最后一行publi...明显是拼写错误(应该是public),而且类定义不完整,这会直接导致编译失败。先把类补全,还要加上你需要的“预约状态”属性——毕竟你要找的是已预约的图书:
package javaapplicationadt2; public class Books { public String ISBN; public boolean isReserved; // 标记图书是否已预约 // 加个构造方法,方便快速创建图书对象 public Books(String isbn, boolean reserved) { this.ISBN = isbn; this.isReserved = reserved; } }
2. 线性搜索的正确实现
线性搜索的逻辑很简单:遍历数组,逐个检查图书是否已预约,找到目标就返回(如果要找所有已预约的,就改成收集到列表里):
// 从原数组中找到第一本已预约的图书 private Books findReservedBook(Books[] originalBooks) { for (Books book : originalBooks) { // 先判空,避免空指针异常 if (book != null && book.isReserved) { return book; } } return null; // 没找到已预约的图书就返回null }
3. 插入到新数组起始位置的正确逻辑
这里要注意:新数组要能容纳所有原数组元素,把找到的目标图书放在索引0,剩下的元素依次往后挪,还要跳过已经放到起始位置的那本(避免重复):
private Books[] insertToNewArrayStart(Books[] originalBooks, Books targetBook) { if (targetBook == null) { return originalBooks; // 没找到目标,直接返回原数组 } Books[] newArray = new Books[originalBooks.length]; // 把目标图书放到新数组的起始位置 newArray[0] = targetBook; // 遍历原数组,把非目标的图书依次填入新数组的后续位置 int currentIndex = 1; for (Books book : originalBooks) { if (book != null && !book.ISBN.equals(targetBook.ISBN)) { newArray[currentIndex++] = book; } } return newArray; }
4. 你可能踩的其他坑
- 空指针异常:遍历数组时一定要先判断
book != null,不然调用book.isReserved或者book.ISBN会直接崩掉。 - 重复元素处理:如果原数组有多本相同ISBN的已预约图书,你要明确是只取第一本还是全部,上面的代码是取第一本,要是需要全部,得调整搜索逻辑改成收集列表。
- 数组越界:新数组的长度要和原数组一致(或者根据需求调整),别随便写死长度导致元素放不下。
要是你能把完整的故障代码贴出来,我还能更精准地定位问题,但从目前的信息来看,先把Books类的语法错误修好,再对照上面的逻辑检查你的搜索和插入代码,应该就能解决问题了。
内容的提问来源于stack exchange,提问作者Emanuel
相关产品推荐
相关产品推荐

