任务简述
还记得之前的图书管理吗?学习了集合以后,使用集合来进行图书信息的 存储吧。
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给获取,才能正常运行,还有一些输入没有捕获异常有待优化。