集合综合案例——图书管理系统
一、图书管理系统业务分析
目标:图书管理系统的开发。
业务需求分析:
(1)查看全部书籍。query
(2)添加书本信息。add
(3)删除书本信息。delete
(4)修改书本信息。update
(5)退出系统。 exit
书本信息的结构:
类型 书名 价格 作者
---------------------------------------------------
言情小说
《金瓶梅》 99.9 阿猫
《红楼梦》 198.2 曹雪芹
武侠小说
《三少爷的剑》 98.2 古龙
《神雕侠侣》 98.2 金庸
------------------------------------------------------
分析:
(1)定义一个书本类。
(2)定义一个集合表示图书馆用于存储书本信息数据:Map<String,List<Book>>。
(3)展示操作界面。
(4)完成相应功能。
1.查看全部书籍
1.定义一个书本类封装属性和方法
public class Book {
//书名
private String name;
//价格
private double price;
//作者
private String author;
public Book() {
}
public Book(String name, double price, String author) {
this.name = name;
this.price = price;
this.author = author;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
2.定义一个集合表示图书馆存储图书信息
因为有书所属的橱窗信息,List集合集不能满足要求,采用Map集合。
键作为书本的橱窗,值是List集合对象存储基本的书籍信息。
public static final Map<String, List<Book>> BOOK_STORE = new HashMap<>();
定义一个扫描器完成对输入的扫描
public static final Scanner SYS_SCANNER = new Scanner(System.in);
3.展示操作界面
private static void showCommand() {
System.out.println("===============欢迎您进入系统===================");
System.out.println("(1)查看全部书籍。query");
System.out.println("(2)添加书本信息。add");
System.out.println("(3)删除书本信息。delete");
System.out.println("(4)修改书本信息。update");
System.out.println("(5)退出系统。 exit");
System.out.print("请您输入您的操作命令:");
String command = SYS_SCANNER.nextLine();
// 判断用户的命令是想干啥
switch (command){
case "query":
// 查看全部书籍
queryBooks();
break;
case "add":
// 添加书籍
addBook();
break;
case "delete":
// 删除书籍
deleteBooke();
break;
case "update":
// 修改书籍
updateBook();
break;
case "exit":
// 退出系统
System.out.println("退出成功,期待您下次光临!");
System.exit(0);
break;
default:
System.err.println("您的命令输入有无,请重新确认!");
}
showCommand(); // 调用自己,实现循环的效果
}
4.查询全部书本信息的方法
先查看存储书籍信息的Map集合是否为空,为空提示补充书籍,反之遍历该类型下的橱柜中的全部书本对象
/**
查询全部书本信息
Map<String, List<Book>> BOOK_STORE = {type1=[b1, b2, b3] , type2=[b1] }
*/
private static void queryBooks() {
System.out.println("===============欢迎您进入查询书本业务=================");
//查看存储书籍信息的Map集合是否为空
if(BOOK_STORE.size() == 0){
//为空提示补充书籍
System.out.println("您的图书馆一本书都没有,请补充书籍!");
}else{
System.out.println("类型\t\t\t\t书名\t\t\t\t\t价格\t\t\t作者");
//使用lambda表达式来遍历
BOOK_STORE.forEach((type , books) -> {
System.out.println(type);
// 反之遍历该类型下的橱柜中的全部书本对象
for (Book book : books) {
System.out.println("\t\t\t\t"+book.getName()+"\t\t\t"+book.getPrice()+"\t\t"+book.getAuthor());
}
});
}
}
2.添加书本信息
添加本信息要知道添加到哪个橱柜里,所以先定义一个List集合用于指向栏目的橱柜,用于存储在这个栏目中的书籍信息,这个橱柜要根据栏目是否存在来确定是使用已经存在的橱柜还是创建一个新橱柜。如果栏目存在,则直接得到该栏目存在的橱柜对象,然后输入新的书本信息,再把书本信息封装到一个书本类对象里,再把书本对象添加到List集合中。如不存在该栏目,则为该栏目创建一个新的橱柜对象,再把新栏目和书添加进去。由于采用List集合存储书籍信息,所以会出现书籍信息重复。本例并未做去重。
/**
添加书本信息数据
Map<String, List<Book>> BOOK_STORE = {type1=[] , }
*/
private static void addBook() {
//提示已经进入添加书本业务
System.out.println("===============欢迎您进入添加书本业务=================");
System.out.print("请您输入添加书本的栏目:");
String type = SYS_SCANNER.nextLine();
// 定义一个List集合用于指向栏目的橱柜
// 这个橱柜变量要根据栏目是否存在来确定是用已经存在的橱柜,还是创建一个新橱柜!
List<Book> books = null ;
// 1.判断是否存在该栏目。
if(BOOK_STORE.containsKey(type)) {
// 3.存在该栏目
// 直接得到该栏目存在的橱柜对象
books = BOOK_STORE.get(type);
}else{
// 2.该栏目是第一次添加。
// 为该栏目创建一个橱柜对象(List<Book>)
books = new ArrayList<>();
// 新橱柜和新栏目必须手工加入到图书馆!
BOOK_STORE.put(type , books);
}
System.out.println("请您输入添加书本的名称:");
String name = SYS_SCANNER.nextLine();
System.out.println("请您输入添加书本的价格:");
String price = SYS_SCANNER.nextLine();
System.out.println("请您输入添加书本的作者:");
String author = SYS_SCANNER.nextLine();
// 定义一个书本对象封装用户输入的书本信息。
Book book = new Book(name , Double.valueOf(price) , author);
books.add(book);
System.out.println("您添加在"+type+"下的书本"+book.getName()+"成功!");
}
3.删除书本信息
删除书本之前,遍历一下所有书籍。
删除过程:判断需要删除的书籍存在的栏目是否存在,如果栏目存在,则根据栏目和书名找到那本书,再判断该书是否为null,如果该书为null,提示该书不存在,反之取出这个栏目所在橱柜的集合,找出那本书然后删掉。如果栏目不存在,则提示重新输入栏目。
/**
* 在某个栏目下,根据书名查询出这本书对象返回!
* @param type 栏目名称
* @param name 书名称
* @return 书本对象
*/
public static Book getBookByTypeAndName(String type , String name){
// 1.先提取这个栏目的橱柜,根据栏目提取它的值
List<Book> books = BOOK_STORE.get(type);
for (Book book : books) {
// 如果本书的名称与要找的名称一样,该书就是我们要的,直接返回!
if(book.getName().equals(name)){
return book;
}
}
return null;// 没有这本书
}
/**
* 删除书本信息
* */
private static void deleteBooke(){
System.out.println("==============删除书本业务==============");
queryBooks();
System.out.print("请输入你要删除的书所在的栏目:");
String type= SYS_SCANNER.nextLine();
//判断是否有栏目
if (BOOK_STORE.containsKey(type)) {
while (true) {
//栏目存在
//根据栏目取值,找到那本想要删除的书
System.out.println("你要删除哪本书?");
String name = SYS_SCANNER.nextLine();
//根据栏目和书名找到这本书
Book book = getBookByTypeAndName(type, name);
//判断这本书是否为null
if (book == null) {
System.out.println("这本书不存在!");
} else {
//书存在
//取出这个栏目的橱柜集合,找出那本书然后删除
List<Book> books = BOOK_STORE.get(type);
books.remove(book);
System.out.println("删除成功!");
//删除成功再查一遍
queryBooks();
return;
}
}
}else{
//输入栏目不存在
System.out.println("输入栏目不存在,请重新输入");
}
}
4.修改书本信息
修改之前判断Map集合中是否有信息存在,如不存在信息则无法修改。
如果有信息存在,再判断存放书籍的栏目是否存在,不存在则提示重新输入栏目。如栏目存在,输入需要修改的栏目名,再输入书名,接着根据栏目和书名对书进行判断,是否存在该书信息。不存在该书就返回消息提示重新输入,该书存在就修改其信息。随后将新的信息存入到该List集合中,结束修改。
/**
修改书本信息。
*/
private static void updateBook() {
if(BOOK_STORE.size() == 0 ){
System.out.println("您现在根本没有任何栏目可以修改!");
}else{
queryBooks();
System.out.println("===============欢迎您进入修改书本业务=================");
while(true){
System.out.print("请您输入修改书本的栏目:");
String type = SYS_SCANNER.nextLine();
// 1.判断是否存在该栏目
if(BOOK_STORE.containsKey(type)){
while(true){
// 存在该栏目
// 2.请输入要修改的书名
System.out.print("请您输入修改书本的名称:");
String name = SYS_SCANNER.nextLine();
// 3.判断该栏目下是否存在该书本对象。
// 根据栏目和书名去栏目下查询出这本书对象
Book book = getBookByTypeAndName(type , name);
if(book == null){
System.err.println("您的输入的书名不存在,请重新确认!");
}else{
// 书名正确了,开始正式修改
System.out.println("请您输入修改书本的新名称:");
String newName = SYS_SCANNER.nextLine();
System.out.println("请您输入修改书本的新价格:");
String newPrice = SYS_SCANNER.nextLine();
System.out.println("请您输入修改书本的新作者:");
String newAuthor = SYS_SCANNER.nextLine();
book.setName(newName);
book.setPrice(Double.valueOf(newPrice));
book.setAuthor(newAuthor);
queryBooks();
System.out.println("您修改的书本成功,请看如上信息确认!");
return; // 结束修改的方法!
}
}
}else{
// 不存在该栏目
System.err.println("您输入的栏目不存在,请重新确认!");
}
}
}
}
5.退出系统
在switch中的一个退出系统功能分支下使用System.exit(0);来中断系统运行。
二、完整代码
/**
目标:图书管理系统的开发。
业务需求分析:
(1)查看全部书籍。query
(2)添加书本信息。add
(3)删除书本信息。delete
(4)修改书本信息。update
(5)退出系统。 exit
书本信息的结构:
类型 书名 价格 作者
---------------------------------------------------
言情小说
《金瓶梅》 99.9 阿猫
《红楼梦》 198.2 曹雪芹
武侠小说
《三少爷的剑》 98.2 古龙
《神雕侠侣》 98.2 金庸
------------------------------------------------------
分析:
(1)定义一个书本类。
(2)定义一个集合表示图书馆用于存储书本信息数据:Map<String,List<Book>>。
(3)展示操作界面。
(4)完成相应功能。
*/
public class BookSystem {
/**
1.定义一个集合表示图书馆用于存储书本信息数据:Map<String,List<Book>>。
使用Map集合,键是橱柜的栏目类型名称,值是橱柜的List集合对象存储书本信息
*/
public static final Map<String, List<Book>> BOOK_STORE = new HashMap<>();
public static final Scanner SYS_SCANNER = new Scanner(System.in);
public static void main(String[] args) {
/**
* 2.展示操作界面 :独立功能建立封装成方法调用 方便互相之间的逻辑调用 */
showCommand();
}
/**
* 展示操作界面的命令
*/
private static void showCommand() {
System.out.println("===============欢迎您进入系统===================");
System.out.println("(1)查看全部书籍。query");
System.out.println("(2)添加书本信息。add");
System.out.println("(3)删除书本信息。delete");
System.out.println("(4)修改书本信息。update");
System.out.println("(5)退出系统。 exit");
System.out.print("请您输入您的操作命令:");
String command = SYS_SCANNER.nextLine();
// 判断用户的命令是想干啥
switch (command){
case "query":
// 查看全部书籍
queryBooks();
break;
case "add":
// 添加书籍
addBook();
break;
case "delete":
// 删除书籍
deleteBooke();
break;
case "update":
// 修改书籍
updateBook();
break;
case "exit":
// 退出系统
System.out.println("退出成功,期待您下次光临!");
System.exit(0);
break;
default:
System.err.println("您的命令输入有无,请重新确认!");
}
showCommand(); // 调用自己,实现循环的效果
}
/**
添加书本信息数据
Map<String, List<Book>> BOOK_STORE = {type1=[] , }
*/
private static void addBook() {
//提示已经进入添加书本业务
System.out.println("===============欢迎您进入添加书本业务=================");
System.out.print("请您输入添加书本的栏目:");
String type = SYS_SCANNER.nextLine();
// 定义一个List集合用于指向栏目的橱柜
// 这个橱柜变量要根据栏目是否存在来确定是用已经存在的橱柜,还是创建一个新橱柜!
List<Book> books = null ;
// 1.判断是否存在该栏目。
if(BOOK_STORE.containsKey(type)) {
// 3.存在该栏目
// 直接得到该栏目存在的橱柜对象
books = BOOK_STORE.get(type);
}else{
// 2.该栏目是第一次添加。
// 为该栏目创建一个橱柜对象(List<Book>)
books = new ArrayList<>();
// 新橱柜和新栏目必须手工加入到图书馆!
BOOK_STORE.put(type , books);
}
System.out.println("请您输入添加书本的名称:");
String name = SYS_SCANNER.nextLine();
System.out.println("请您输入添加书本的价格:");
String price = SYS_SCANNER.nextLine();
System.out.println("请您输入添加书本的作者:");
String author = SYS_SCANNER.nextLine();
// 定义一个书本对象封装用户输入的书本信息。
Book book = new Book(name , Double.valueOf(price) , author);
books.add(book);
System.out.println("您添加在"+type+"下的书本"+book.getName()+"成功!");
}
/**
查询全部书本信息
Map<String, List<Book>> BOOK_STORE = {type1=[b1, b2, b3] , type2=[b1] }
*/
private static void queryBooks() {
System.out.println("===============欢迎您进入查询书本业务=================");
if(BOOK_STORE.size() == 0){
System.out.println("您的图书馆一本书都没有,请赶紧买书去!");
}else{
System.out.println("类型\t\t\t\t书名\t\t\t\t\t价格\t\t\t作者");
BOOK_STORE.forEach((type , books) -> {
System.out.println(type);
// 遍历该类型下的橱柜中的全部书本对象
for (Book book : books) {
System.out.println("\t\t\t\t"+book.getName()+"\t\t\t"+book.getPrice()+"\t\t"+book.getAuthor());
}
});
}
}
/**
修改书本信息。
*/
private static void updateBook() {
if(BOOK_STORE.size() == 0 ){
System.out.println("您现在根本没有任何栏目可以修改!");
}else{
queryBooks();
System.out.println("===============欢迎您进入修改书本业务=================");
while(true){
System.out.print("请您输入修改书本的栏目:");
String type = SYS_SCANNER.nextLine();
// 1.判断是否存在该栏目
if(BOOK_STORE.containsKey(type)){
while(true){
// 存在该栏目
// 2.请输入要修改的书名
System.out.print("请您输入修改书本的名称:");
String name = SYS_SCANNER.nextLine();
// 3.判断该栏目下是否存在该书本对象。
// 根据栏目和书名去栏目下查询出这本书对象
Book book = getBookByTypeAndName(type , name);
if(book == null){
System.err.println("您的输入的书名不存在,请重新确认!");
}else{
// 书名正确了,开始正式修改
System.out.println("请您输入修改书本的新名称:");
String newName = SYS_SCANNER.nextLine();
System.out.println("请您输入修改书本的新价格:");
String newPrice = SYS_SCANNER.nextLine();
System.out.println("请您输入修改书本的新作者:");
String newAuthor = SYS_SCANNER.nextLine();
book.setName(newName);
book.setPrice(Double.valueOf(newPrice));
book.setAuthor(newAuthor);
queryBooks();
System.out.println("您修改的书本成功,请看如上信息确认!");
return; // 结束修改的方法!
}
}
}else{
// 不存在该栏目
System.err.println("您输入的栏目不存在,请重新确认!");
}
}
}
}
/**
* 在某个栏目下,根据书名查询出这本书对象返回!
* @param type 栏目名称
* @param name 书名称
* @return 书本对象
*/
public static Book getBookByTypeAndName(String type , String name){
// 1.先提取这个栏目的橱柜,根据栏目提取它的值
List<Book> books = BOOK_STORE.get(type);
for (Book book : books) {
// 如果本书的名称与要找的名称一样,该书就是我们要的,直接返回!
if(book.getName().equals(name)){
return book;
}
}
return null;// 没有这本书
}
/**
* 删除书本信息
* */
private static void deleteBooke(){
System.out.println("==============删除书本业务==============");
queryBooks();
System.out.print("请输入你要删除的书所在的栏目:");
String type= SYS_SCANNER.nextLine();
//判断是否有栏目
if (BOOK_STORE.containsKey(type)) {
while (true) {
//栏目存在
//根据栏目取值,找到那本想要删除的书
System.out.println("你要删除哪本书?");
String name = SYS_SCANNER.nextLine();
//根据栏目和书名找到这本书
Book book = getBookByTypeAndName(type, name);
//判断这本书是否为null
if (book == null) {
System.out.println("这本书不存在!");
} else {
//书存在
//取出这个栏目的橱柜集合,找出那本书然后删除
List<Book> books = BOOK_STORE.get(type);
books.remove(book);
System.out.println("删除成功!");
//删除成功再查一遍
queryBooks();
return;
}
}
}else{
//输入栏目不存在
System.out.println("输入栏目不存在,请重新输入");
}
}
}