Java SE 实现简单的图书管理系统(完善菜单操作)
在前文中,已经搭建好图书管理系统的基本框架了,还差菜单的操作没有完善,只是简单的打印。现在让我们将它的菜单操作完善,按照难易程度来挨个实现。
我们一个个来。
1.查找图书
可以根据图书的名字来进行查找,利用遍历的思路(可通过循环实现)。先输入要查找图书的名字,接着按名字在书架上一个个找,找到了就展示该图书的状态;找不到就说明书架上没有这本书。
查找图书操作:
package operations;import book.Book; import book.BookList;import java.util.Scanner;public class FindOperation implements IOperation{public void work(BookList bookList) {System.out.println("1. 查找图书!");Scanner scanner = new Scanner(System.in);System.out.println("请输入你要查找的图书的名字:");String name = scanner.nextLine();int sz = bookList.getBookSize(); //获取当前书架上图书的数量for (int i = 0 ;i < sz ;i++) {if(name.equals(bookList.getBook(i).getName())) { //通过equals方法进行名字比较Book book = bookList.getBook(i);System.out.println("找到了:");System.out.println(book); //展示该图书的状态return; //结束遍历(找到时)}}System.out.println("没有这本书!"); //未找到执行return;} }
在写上述查找图书操作代码前,有些必要的工作是要做的:在书架类BookList中,我们并未其字段提供访问方法,因此这里需要提供一下。
书架类:
package book;public class BookList {private Book[] books = new Book[10]; //这个书架存放10本书,具体存放几本书可以修改。private int bookSize; //当前书架上图书的数目//无参数的构造方法public BookList() {books[0] = new Book("三国演义","罗贯中",20,"小说");books[1] = new Book("水浒传","施耐庵",20,"小说");books[2] = new Book("西游记","吴承恩",20,"小说");books[3] = new Book("红楼梦","曹雪芹",20,"小说");this.bookSize = 4;}//先往书架上放4本书//以下为Book类中字段的访问方法:public Book getBook(int i) { //获取第i本图书return books[i];}public int getBookSize() {return bookSize;}public void setBooks(Book[] books) {this.books = books;}public void setBookSize(int bookSize) {this.bookSize = bookSize;}
}
书架上默认放了四本书,现在我们来测试一下,预期的结果:如果找到了指定的图书,则展示该图书当前的状态,否则告知我们没有这本书。
运行结果:
很好,符合我们的预期,但是在展示图书状态时,并不能让人满意,因为这个借阅状态不是很明确,这里可以通过对Book类中重写的 toString方法 进行修改来解决,具体如下:
public String toString() {return "Book{" +"书名:" + name +" 作者:" + author +" 价格:" + price +" 类型:" + type +" 借阅状态:" + ((isBorrowed == true?"已被借阅":"未被借阅")) +'}'; }
因为借阅状态是 boolean型,我们可以通过三目操作符进行判断,如果 isBorrowed 为真,则说明图书被借走了;否则,未被借阅。这样子展示图书状态看着就舒服多了。
这样,查找图书操作就完成了!
2.新增图书
图书管理系统的操作对象是书架,而书架是用数组来实现的,那么对于新增图书操作,我们可以从数组的角度切入,先输入一图书的信息,接着放到BookList数组中,同时图书数+1即可。用图片可以这样表示:
那么通过代码实现如下:
package operations;import book.Book; import book.BookList;import java.util.Scanner;public class AddOperation implements IOperation{public void work(BookList bookList) {//获取当前书架上的图书数int sz = bookList.getBookSize();//判断书架是否满了if (sz == bookList.getBooks().length) {System.out.println("书架满了,放不下了!");return;}//没满就继续执行Scanner scanner = new Scanner(System.in);System.out.println("请输入需要新增图书的书名:");String name = scanner.nextLine();System.out.println("请输入需要新增图书的作者:");String author = scanner.nextLine();System.out.println("请输入需要新增图书的价格:");int price = scanner.nextInt();System.out.println("请输入需要新增图书的类型:");String type = scanner.nextLine();//新增的图书Book book = new Book(name,author,price,type);//将新增的图书放到书架上bookList.setBooks(sz,book);//令书本数+1bookList.setBookSize(sz+1);return;} }
注:在新增图书之前,先判断一下书架满了没,可以通过BookList类的对字段的访问方法得到BookList数组,再通过length方法得到数组的大小,与当前图书数进行比较,相等即满了,不然还能装。
BookList类中新增的访问字段方法:
package book;public class BookList {private Book[] books = new Book[10]; //这个书架存放10本书,具体存放几本书可以修改。private int bookSize; //当前书架上图书的数目//无参数的构造方法public BookList() {books[0] = new Book("三国演义","罗贯中",20,"小说");books[1] = new Book("水浒传","施耐庵",20,"小说");books[2] = new Book("西游记","吴承恩",20,"小说");books[3] = new Book("红楼梦","曹雪芹",20,"小说");this.bookSize = 4;}//先往书架上放4本书//以下为Book类中字段的访问方法:public Book getBook(int i) { //获取第i本图书return books[i];}public int getBookSize() {return bookSize;}public Book[] getBooks() { //获取图书数组,即书架return books;} //将新增的图书放到书架上public void setBooks(int sz,Book book) {this.books[sz] = book;}public void setBookSize(int bookSize) {this.bookSize = bookSize;} }
进行测试,得:
可以看到新图书“语文课本”成功添加到书架上了。
3.显示图书
显示图书操作其实很简单,只需要遍历书架,然后一个个展示就好。代码如下:
package operations;import book.Book; import book.BookList;public class ShowOperation implements IOperation{public void work(BookList bookList) {//获取当前图书数int sz = bookList.getBookSize();//开始遍历、展示for(int i = 0 ;i < sz ;i++) {Book book = bookList.getBook(i);System.out.println(book);}} }
进行测试,得:
成功实现。
4.退出系统
要实现退出系统操作,需要借助 System.exit(int status) 方法,参数status表示退出状态,传入0为正常退出。可以使用它来退出main方法,实现代码如下:
package operations;import book.BookList;public class ExistOperation implements IOperation{public void work(BookList bookList) {System.out.println("成功退出系统!");System.exit(0);} }
测试结果如下:
成功实现。
5.借阅图书
对于借阅图书操作,思路其实与查找图书差不多,可以根据图书书名找到该书,先判断一下该书是否被借,如果未被借阅,则修改它的借阅状态即可。实现代码如下:
package operations;import book.Book; import book.BookList;import java.util.Scanner;public class BorrowOperation implements IOperation{public void work(BookList bookList) {Scanner scanner = new Scanner(System.in);System.out.println("请输入你要借阅的图书的名字:");String name = scanner.nextLine();int sz = bookList.getBookSize(); //获取当前书架上图书的数量for (int i = 0 ;i < sz ;i++) {if(name.equals(bookList.getBook(i).getName())) { //通过equals方法进行名字比较Book book = bookList.getBook(i);if(book.isBorrowed() == true) {System.out.println("这本书被借走了!");return;}else {System.out.println("借阅成功!");book.setBorrowed(true);return;}}System.out.println("没有这本书!"); //未找到执行return;}} }
在写代码之前要在Book类中补充获取和设置借阅状态的访问方法:
//获得借阅状态的访问方法 public boolean isBorrowed() {return isBorrowed; }//设置借阅状态的访问方法 public void setBorrowed(boolean borrowed) {isBorrowed = borrowed; }
进行测试,得:
很好,成功!
6.归还图书
归还图书操作其实就是借阅图书的相反操作。实现代码如下:
进行测试,得:
也是成功实现了!
7. 删除图书
删除图书的操作就稍微难一点了,不过问题不大,还是回归到数组,经过前面的操作实现,我们发现:对书架进行操作时,往往依靠的是图书数,遍历也是如此,有几本书我就遍历几次。那么删除图书操作可以通过要被删除的图书的下标实现,具体方式:先用遍历的方式找出该图书的位置,若遍历完了也没找到,说明书架上没有这本书,如果这本书在书架上,无非就两种情况:1.这本书的后面有书;2.这本书的后面没书。
对于第一种情况,我们用它后面的书把它覆盖掉即可,图示:
对于第二种情况,我们只需把图书数-1即可,图示:
总结:其实无论是第一种情况还是第二种情况,我们都可以通过被删除图书后面的图书前移覆盖和图书数-1的操作实现。
具体代码如下:
package operations;import book.BookList;import java.util.Scanner;public class DeleteOperation implements IOperation{public void work(BookList bookList) {int sz = bookList.getBookSize();Scanner scanner = new Scanner(System.in);System.out.println("请输入你要删除的图书的名字:");String name = scanner.nextLine();int i = 0;int pos = -1;//开始找要删除图书的位置,找到了就退出循环for (; i < sz; i++) {if(bookList.getBook(i).getName().equals(name)) {pos = i;break;}}//i = sz说明书架遍历结束,但未找到图书的位置,那么书架上没有该图书if(i == sz) {System.out.println("书架上没有你要删除的图书。");return;}//若该图书在书架上,则将它后面的图书前移for (int j = pos; j < sz - 1; j++) { //这里j < sz-1,如果是 j < sz 会导致越界访问!!!bookList.setBooks(j,bookList.getBook(j+1));}//图书数-1bookList.setBookSize(sz - 1);System.out.println("删除完成!");} }
进行测试,得:
确实按照我们的要求去删除了,成功!
到此,简易式图书管理系统就大功告成了,比起如何去丰富它的内容,如何构建框架更加的重要!