Java进阶:图书馆管理系统(非可视化)

任务简述

还记得之前的图书管理吗?学习了集合以后,使用集合来进行图书信息的 存储吧。
1.管理员登陆
2.图书管理
2.1 图书新增
2.2 图书修改
2.3 图书删除
2.4 根据图书名称模糊查找图书
2.5 查看所有图书 (三种排序)
(新增)价格从高到低排序
(新增)价格从低到高排序
(新增)新旧排序(出版日期排序)

题目分析

1.图书信息:价格,图书编号(不可重复),出版日期(Date),图书名。
2.数据结构:因为图书的信息有不同的数据类型(int,String,Date)并且还需要有排序,所以想采用TreeSet进行存储,他配合自定义类有自定义的排序方法,根据不同的排序我们只需要定义不同的排序方法,再顺序地展示出来即可满足排序的需求。
登录系统我计划采用HashMap,进行采用,用户名和HashMap中的key一样是独一无二的,并且都有与之匹配的密码和value,可以说是不谋而合。

代码展示

话不多说直接实战来康康吧。
首先先把view的控制台显示界面先写出来。

package com.java.library;

import java.util.Scanner;

public class View {
    
    
	View() {
    
    
	}

	private Scanner input = new Scanner(System.in);

	public void welcome() {
    
    
		System.out.println("欢迎使用图书管理系统!");
	}

	public int chooseIdentity() {
    
    
		System.out.println("请问您是:1-新用户,2-老用户,0-退出");
		String identity = input.nextLine();
		int num = -1;
		try {
    
    
			num = Integer.parseInt(identity);
		} catch (NumberFormatException e) {
    
    
			System.out.println("输入错误,内容必须是0,1,2的数字,请重新输入.");
		}
		if (num < 0 || num > 2) {
    
    
			System.out.println("输入错误,请重新输入.");
			return chooseIdentity();
		}
		return num;
	}

	public void login(boolean flag) {
    
    
		if (flag) {
    
    
			System.out.println("登录成功!");
		} else {
    
    
			System.out.println("登录失败。");
		}
	}

	public void register(boolean flag) {
    
    
		if (flag) {
    
    
			System.out.println("注册成功!");
		} else {
    
    
			System.out.println("注册失败。");
		}
	}

	public int cMenu() {
    
    
		System.out.println("请选择操作:1-图书新增,2-图书修改,3-图书删除,4-根据图书名称模糊查找图书,5-查看所有图书,0-退出");
		String operation = input.nextLine();
		int num = -1;
		try {
    
    
			num = Integer.parseInt(operation);
		} catch (NumberFormatException e) {
    
    
			System.out.println("输入错误,内容必须是0,1,2,3,4,5的数字,请重新输入.");
		}
		if (num < 0 || num > 5) {
    
    
			System.out.println("输入错误,请重新输入.");
			return cMenu();
		}
		return num;
	}
	public int showMenu() {
    
    
		System.out.println("请选择类型:1-价格升序,2价格降序,3-日期升序");
		String operation = input.nextLine();
		int num = -1;
		try {
    
    
			num = Integer.parseInt(operation);
		} catch (NumberFormatException e) {
    
    
			System.out.println("输入错误,内容必须是1,2,3的数字,请重新输入.");
		}
		if (num < 1 || num > 3) {
    
    
			System.out.println("输入错误,请重新输入.");
			return cMenu();
		}
		return num;
	}
	public String insert1() {
    
    
		System.out.println("请输入图书编号:");
		String number = input.nextLine();
		return number;
	}

	public String insert2() {
    
    
		System.out.println("请输入图书名称:");
		String company = input.nextLine();
		return company;
	}

	public int insert3() {
    
    
		System.out.println("请输入图书价格:");
		int prize = input.nextInt();
		String c = input.nextLine();
		return prize;
	}

	public String insert4() {
    
    
		System.out.println("请输入图书大概名称:");
		String name = input.nextLine();
		return name;
	}
	public void addCompele() {
    
    
		System.out.println("添加完毕!");
	}

	/*
	 * public String findById() { System.out.println("请输入图书编号:"); String number =
	 * input.nextLine(); return number; }
	 */

	public String oldId() {
    
    
		System.out.println("请输入你要修改的图书编号:");
		String id = input.nextLine();
		return id;
	}

	public String newId() {
    
    
		System.out.println("请输入新的图书编号:");
		String id = input.nextLine();
		return id;
	}

	public String newName() {
    
    
		System.out.println("请输入新的图书名:");
		String name = input.nextLine();
		return name;
	}

	public int newPrize() {
    
    
		System.out.println("请输入新的图书价格:");
		int prize = input.nextInt();
		String c = input.nextLine();
		return prize;
	}

	public void updateComplete() {
    
    
		System.out.println("修改成功。");
	}

	public void updateFail() {
    
    
		System.out.println("修改失败。");
	}

	public String deleteNumber() {
    
    
		System.out.println("请输入你要删除的图书编号:");
		String deleteId = input.nextLine();
		return deleteId;
	}

	public void deleteComplete() {
    
    
		System.out.println("删除成功。");
	}

	public void deleteFail() {
    
    
		System.out.println("删除失败。");
	}

}

我们再把登录的类进行定义,采取map进行存储,key为用户名,value为密码。只有匹配才能完成。

package com.java.library;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Login {
    
    
	private Scanner input = new Scanner(System.in);
	private Map<String,String> userLogin = new HashMap<String,String>();//定义
	Login(){
    
    //初始化构造函数,默认账号
		userLogin.put("Admin","123456");
		userLogin.put("LZY", "123465");
	}
	public boolean register() {
    
    //注册
		System.out.println("请输入用户名:");
		String id = input.nextLine();
		System.out.println("请输入密码:");
		String password = input.nextLine();
		if(userLogin.containsKey(id)) {
    
    
			C.ii = false; 
			return false;
		}
		userLogin.put(id, password);
		C.ii = true; 
		return true;
	}
	public boolean login() {
    
    //登录系统
		System.out.println("请输入用户名:");
		String id = input.nextLine();
		System.out.println("请输入密码:");
		String password = input.nextLine();
		String idUser = userLogin.get(id);
		try{
    
    
			if(idUser.equals(password)) {
    
    
				C.ii = true; 
				return true;
			}
			
		}catch(NullPointerException e) {
    
    
			System.out.println("没有该用户名。");
			C.ii = false; 
			return false;

		}
	
		C.ii = false; 
		return false;
	}
}

因为有三种排序,我才用TreeSet这种方法进行实现,但是我个人感觉只是一种蛮笨的方法,要是能重载compareTo方法就好了,但是现在我想出来算是还比较好的排序方法。

package com.java.library;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.ListIterator;
import java.util.TreeSet;

public class Data {
    
    
	static int ig = 0;
	private TreeSet<Library1> dataPrizeHignToLow = new TreeSet<Library1>();	
	private TreeSet<Library2> dataPrizeLowToHign = new TreeSet<Library2>();	
	private TreeSet<Library3> dataDateNewToOld = new TreeSet<Library3>();	
	public void addBook(String id,String name,int prize) {
    
    
		dataPrizeHignToLow.add(addBook1(id,name,prize));
		dataPrizeLowToHign.add(addBook2(id,name,prize));
		dataDateNewToOld.add(addBook3(id,name,prize));
	}
	private Library1 addBook1(String id, String name, int prize) {
    
    
		Library1 l = new Library1(id,name,prize);
		return l;
	}
	private Library2 addBook2(String id, String name, int prize) {
    
    
		Library2 l1 = new Library2(id,name,prize);
		return l1;
	}
	private Library3 addBook3(String id, String name, int prize) {
    
    
		Library3 l2 = new Library3(id,name,prize);
		return l2;
	}
	public void deleteBook(String id) {
    
    
		Iterator<Library1> iterator = dataPrizeHignToLow.iterator();
		Iterator<Library2> iterator2 = dataPrizeLowToHign.iterator();
		Iterator<Library3> iterator3 = dataDateNewToOld.iterator();
		while(iterator.hasNext()) {
    
    
			if(iterator.next().bookId.equals(id)) {
    
    
				iterator.remove();
				break;
			}	
		}
		while(iterator2.hasNext()) {
    
    
			if(iterator2.next().bookId.equals(id)) {
    
    
				iterator2.remove();
				break;
			}	
		}
		while(iterator3.hasNext()) {
    
    
			if(iterator3.next().bookId.equals(id)) {
    
    
				iterator3.remove();
				break;
			}	
		}
		
		
		
	}
	public void changeBook(String id,String newId,String name,int prize) {
    
    
		Iterator<Library1> iterator = dataPrizeHignToLow.iterator();
		Iterator<Library2> iterator2 = dataPrizeLowToHign.iterator();
		Iterator<Library3> iterator3 = dataDateNewToOld.iterator();
		while(iterator.hasNext()) {
    
    
			if(iterator.next().bookId.equals(id)) {
    
    
				iterator.remove();
				dataPrizeHignToLow.add(addBook1(newId,name,prize));
				break;
			}
		}
		while(iterator2.hasNext()) {
    
    
			if(iterator2.next().bookId.equals(id)) {
    
    
				iterator2.remove();
				dataPrizeLowToHign.add(addBook2(newId,name,prize));
				break;
			}	
		}
		while(iterator3.hasNext()) {
    
    
			if(iterator3.next().bookId.equals(id)) {
    
    
				iterator3.remove();
				dataDateNewToOld.add(addBook3(newId,name,prize));
				break;
			}	
		}
	}
	
	public void findByName(String name) {
    
    
		boolean flag = true;
		Iterator<Library1> iterator =dataPrizeHignToLow.iterator();
		Iterator<Library1> iterator1 =dataPrizeHignToLow.iterator();
		while(iterator.hasNext()) {
    
    
			ig++;
			if(iterator.next().bookName.contains(name)) {
    
    
				System.out.println("图书编号\t图书名\t图书价格\t图书日期");	
				flag = false;
				break;
			}
		}
		for(int i = 0;i<ig;i++) {
    
    
			if(i == ig-1) {
    
    
				System.out.println(iterator1.next().toString());
				return;
			}
			iterator1.next();
		}
		if(flag) {
    
    
			System.out.println("抱歉,没有找到。");	
		}
	
	}

	public void showBook1() {
    
    
		Iterator<Library1> iterator = dataPrizeHignToLow.iterator();
		System.out.println("=======图书信息(价格升序)=======");
		System.out.println("图书编号\t图书名\t图书价格\t图书日期");
		while(iterator.hasNext()) {
    
    
			Library1 l = iterator.next();
			System.out.println(l.toString());
		}
	}
	public void showBook2() {
    
    
		Iterator<Library2> iterator = dataPrizeLowToHign.iterator();
		System.out.println("=======图书信息(价格降序)=======");
		System.out.println("图书编号\t图书名\t图书价格\t图书日期");
		while(iterator.hasNext()) {
    
    
			Library2 l = iterator.next();
			System.out.println(l.toString());
		}
	}
	public void showBook3() {
    
    
		Iterator<Library3> iterator = dataDateNewToOld.iterator();
		System.out.println("=======图书信息(日期升序)=======");
		System.out.println("图书编号\t图书名\t图书价格\t图书日期");
		while(iterator.hasNext()) {
    
    
			Library3 l = iterator.next();
			System.out.println(l.toString());
		}
	}
	
	
}
class Library1 implements Comparable<Library1>{
    
    
	String bookId;
	String bookName;
	int prize;
	String date;
	//SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd号HH时mm分ss秒");
	//format.format(new Date);
	public Library1(String id, String name, int prize){
    
    
		SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd号HH时mm分ss秒");
		String text = format.format(new Date());
		this.bookId = id;
		this.bookName = name;
		this.prize = prize;
		this.date = text;
	}
	public int compareTo(Library1 o) {
    
    
		if (this.prize > o.prize) {
    
     
			return 1; 
		} 
		else if (this.prize < o.prize) {
    
     
			return -1; 
		} 
		else {
    
     
			return 0; 
		} 
	}
	  public String toString() {
    
    
	        return bookId + "\t" + bookName + "\t" + prize + "\t" + date ;
	}

}
class Library2 implements Comparable<Library2>{
    
    
	String bookId;
	String bookName;
	int prize;
	String date;
	public Library2(String id, String name, int prize){
    
    
		SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd号HH时mm分ss秒");
		String text = format.format(new Date());
		this.bookId = id;
		this.bookName = name;
		this.prize = prize;
		this.date = text;
	}
	public int compareTo(Library2 o) {
    
    
		if (this.prize < o.prize) {
    
     
			return 1; 
		} 
		else if (this.prize > o.prize) {
    
     
			return -1; 
		} 
		else {
    
     
			return 0; 
		} 
	}
	public String toString() {
    
    
	        return bookId + "\t" + bookName + "\t" + prize + "\t" + date ;
	}
}

class Library3 implements Comparable<Library3>{
    
    
	String bookId;
	String bookName;
	int prize;
	String date;
	public Library3(String id, String name, int prize){
    
    
		SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd号HH时mm分ss秒");
		String text = format.format(new Date());
		this.bookId = id;
		this.bookName = name;
		this.prize = prize;
		this.date = text;
	}
	public int compareTo(Library3 o) {
    
    
		if (this.date.compareTo(o.date) == 1) {
    
     
			return 1; 
		} 
		else if (this.date.compareTo(o.date) == -1) {
    
     
			return -1; 
		} 
		else {
    
     
			return 0; 
		} 
	}
	public String toString() {
    
    
	        return bookId + "\t" + bookName + "\t" + prize + "\t" + date ;
	}
}


总函数,对上面的类进行实现,方法进行调用。

package com.java.library;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

import javax.swing.text.html.HTMLDocument.Iterator;

public class C {
    
    
	static View v = new View();
	static Login l = new Login();
	static Data d = new Data();
	public static boolean ii = false;
	public static boolean ij = true;
	public static boolean iii = true;
	public static void main(String[] args) {
    
    
		start();
	}

	static void start() {
    
    
		v.welcome();
		
		while(!(ii)) {
    
    
			switch(v.chooseIdentity()) {
    
    
			case 1:
				v.register(l.register());
				break;
			case 2:
				v.login(l.login());
				break;
			case 0:
				return;
			}
		}
		
		while(ij) {
    
    
			switch(v.cMenu()) {
    
    
			case 1:
				d.addBook(v.insert1(), v.insert2(), v.insert3());
				v.addCompele();
			break;
			case 2:
				d.changeBook(v.oldId(), v.newId(), v.newName(), v.newPrize());
				v.updateComplete();
			break;
			case 3:
				d.deleteBook(v.deleteNumber());
				v.deleteComplete();
			break;
			case 4:
				d.findByName(v.insert4());
			break;
			case 5:
				switch(v.showMenu()) {
    
    
				case 1:
					d.showBook1();
				break;
				case 2:
					d.showBook2();
				break;
				case 3:
					d.showBook3();
				break;
				}
			break;
			case 0:
			return;
			}			
		}
	}
}


结果效果截图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

最后还存在一些bug有待改善,比如说再经历了一个循环后,有的时候会出现
在这里插入图片描述
这样的情况,这是因为input.nextLine(),之前是nextInt()无法接受回车换行,所以在nextInt()之后必须增加一个nextLine()把\n给获取,才能正常运行,还有一些输入没有捕获异常有待优化。

猜你喜欢

转载自blog.csdn.net/cying7/article/details/108571688