接下来我们来介绍各个操作的具体实现
Addoperation
添加操作。很简单,我们一步一步让用户输入书名,作者,价格,类型。之后构造出一个新的book对象,并把它传入书架这个数组的最后,最后将usedsize+1就可以了。需要注意,在我们读取价格后,我们要在用一个输入把后面的回车消去,才能正常输入。
同时,我们在拿到书名后,应该先遍历数组,确认书架上没有这本书,之后才能放心进行添加,如果有,则不能添加,而应该直接返回。
public class AddOperation implements IOoperation{
@Override
public void work(BookList bookList) {
System.out.println("新增图书!");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入书名->");
String name=scanner.next();
System.out.println("请输入作者->");
String author=scanner.next();
System.out.println("请输入价格->");
int price=scanner.nextInt();
scanner.nextLine();//把回车消除
System.out.println("请输入类型->");
String type=scanner.next();
Book book=new Book(name,author,price,type);
int currentsize= bookList.getUsedsize();
for (int i = 0; i < currentsize; i++) {
Book currentbook=bookList.getBooks(i);
if(currentbook.getName().equals(name)){
System.out.println("这本书已经存在,不能被添加!");
return;
}
}
bookList.setBooks(currentsize,book);//默认放到最后
bookList.setUsedsize(currentsize+1);//usedsize++
}
}
DelOperation
删除操作。我们通过用户输入书名进行删除,当我们读取完书名,我们同样要遍历数组,这回我们是要确保书架上存在这本书,不然我们无法进行删除。
当我们确认可以删除后,我们删除的思想是这样的,我们把要删除的元素后面的所有元素都往前挪一个,进行类似覆盖的操作,这样要删除的元素会被它后面的元素覆盖,变成后面的那个元素,达到删除的效果,最后将usedsize-1。
有人会问那最后一个元素岂不是在最后面出现两次吗?我想说这并不影响,因为我们usedsize已经减一,可以代表最后一个并不存在,后续我们进行循环遍历时并不会遍历两次。同时当我们执行添加操作,会直接将最后面那个元素覆盖,因此实际并不影响。
public class DelOperation implements IOoperation{
@Override
public void work(BookList bookList) {
System.out.println("删除图书!");
int currentsize=bookList.getUsedsize();
if(currentsize==0){
System.out.println("目前没有图书可以删除!");
return;
}
System.out.println("请输入您要删除的图书的名称->");
Scanner scanner=new Scanner(System.in);
String delname=scanner.next();
int index=-1;
for (int i = 0; i < currentsize; i++) {
Book currentbook=bookList.getBooks(i);
if(currentbook.getName().equals(delname)){
index=i;
break;
}
}
if(index==-1){
System.out.println("库中没有这本书,无法删除!");
return ;
}
for (int i = index; i <currentsize-1 ; i++) {
bookList.setBooks(index,bookList.getBooks(i+1));
}
bookList.setUsedsize(currentsize-1);
System.out.println("删除完成!");
}
这样我们就完成了删除的操作
FindOperation
查找操作。很简单,我们通过输入的书名遍历数组进行查找,如果全部遍历都没有找到,就提示并没有这本书,如果有就显示它的全部信息,我们可以构造book的toString方法,在这个操作中快速展示图书的所有信息。
public class FindOperation implements IOoperation{
@Override
public void work(BookList bookList) {
System.out.println("查找图书!");
int currentsize=bookList.getUsedsize();
if(currentsize==0){
System.out.println("库中没有图书,无法查找!");
return ;
}
System.out.println("请输入要查找的书名->");
Scanner scanner=new Scanner(System.in);
String findname=scanner.next();
int index=-1;
for (int i = 0; i < currentsize; i++) {
Book currentbook=bookList.getBooks(i);
if(currentbook.getName().equals(findname)){
index=i;
break;
}
}
if(index==-1){
System.out.println("该图书不存在!");
return ;
}
Book findbook=bookList.getBooks(index);
System.out.println("图书信息:");
System.out.println(findbook);
}
ShowOperation
展示全部图书信息。这个更加简单,我们只需要遍历数组,并打印每一个图书信息就可以了。
public class ShowOperation implements IOoperation{
@Override
public void work(BookList bookList) {
System.out.println("展示所有图书!");
int currentsize=bookList.getUsedsize();
for (int i = 0; i < currentsize; i++) {
System.out.println(bookList.getBooks(i));
}
}
BorrowOperation
借阅操作。我们通过书名的输入找到这本书,这里与find操作基本相同。之后我们要确定它的借阅状态,只有当他isborrowed状态为false时,我们才能进行借阅,将false改为true,如果我们查到是true,则代表这本书借阅不了,我们就给出对应提示,返回就可以了。
public class BorrowOperation implements IOoperation{
@Override
public void work(BookList bookList) {
System.out.println("借阅图书!");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要借阅的书名->");
String borrowname=scanner.next();
int curruntsize=bookList.getUsedsize();
int index=-1;
for (int i = 0; i < curruntsize; i++) {
if(bookList.getBooks(i).getName().equals(borrowname)){
index=i;
break;
}
}
if (index==-1){
System.out.println("库中没有这本书,无法借阅!");
return ;
}
Book currentbook=bookList.getBooks(index);
if(currentbook.isIsborrowed()==true){
System.out.println("这本书已经被借阅!");
}else{
currentbook.setIsborrowed(true);
System.out.println("借阅成功!");
}
}
ReturnOperation
归还操作。同样,我们根据书名的输入进行归还,这里跟借阅基本相同,只是把true改为false这样一点点区别。
public class ReturnOperation implements IOoperation {
@Override
public void work(BookList bookList) {
System.out.println("归还图书!");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入书名:");
String name = scanner.nextLine();
int currentSize = bookList.getUsedsize();
for (int i = 0; i < currentSize; i++) {
Book book1 = bookList.getBooks(i);
if(book1.getName().equals(name)) {
book1.setIsborrowed(false);
System.out.println("归还成功!");
return;
}
}
System.out.println("没有你要归还的图书!");
}
}
ExitOperation
最后是退出操作。我们只需要注意退出前把资源全部释放就可以了,把书架清空,usedsize设置为0,最后设置返回值,推出就可以了。
public class ExitOperation implements IOoperation{
@Override
public void work(BookList bookList) {
System.out.println("退出系统!");
int currentsize=bookList.getUsedsize();
for (int i = 0; i < currentsize; i++) {
bookList.setBooks(i,null);
}
bookList.setUsedsize(0);
System.exit(0);
}
}
小结
这样,我们完整的图书代码就完成了,我们几乎用到了前面学过的所有语法,独立完成,对我们来说也是很好的复习。
完整的代码可以私信。