搭建一个工程:BookManager
src包下创建子包 Work Demo
Work包是工程主包,以下的文件都在这个包内。
Demo包是测试包,测试案例放在里面,可以不写。
运行项目自动生成包 data
data包下生成 BookObject.txt MessageRecord.txt
分别存储 书籍信息 和 操作记录。
Main:
package Work;
/******主函数,程序入口*****/
public class Main {
/**
* 此方法是程序入口,只需创建menu对象即可开启本程序.
* @param args main方法,大家都懂
*/
public static void main(String[] args) {
Menu menu = new Menu();
}
}
Book:
package Work;
import java.util.Objects;
/*****图书类*****/
public class Book {
private String name;//书名
private String id;//图书号
private String author;//作者
private double price;//价格
private String url;//网址
//计数与id分配变量
private static int count=0;//书本计数
private static int idCount = 0 ;//id号计数
private static final String id_set = "10000001";//ID生成基础string
//全参构造
public Book(String name, String author, double price, String url) {
this.name = name;
this.author = author;
if(price >= 0){
this.price = price;
}else{
System.out.println("price不能小于0,已经给price默认为0元,请使用修改方法修改price!");
}
this.url = url;
//id自动分配,并且增加书本数量
this.id = (Integer.parseInt(id_set)+ idCount)+"";//分配ID
idCount++;//学号数量加一
count++;//书本数量加一
}
public Book() {
//id自动分配,并且增加书本数量
this.id = (Integer.parseInt(id_set)+ idCount)+"";//分配ID
idCount++;//学号数量加一
count++;//书本数量加一
}
//比较判断方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return name.equals(book.name);
}
//未知
@Override
public int hashCode() {
return Objects.hash(name);
}
//toString
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", id=" + id +
", author='" + author + '\'' +
", price=" + price +
", url='" + url + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
if(price >= 0){
this.price = price;
}else{
System.out.println("price不能小于0,已经给price默认为0元,请重新使用使用修改方法修改price!");
}
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getId() {
return id;
}
public void setId(String id) { this.id = id; }
//id_set不提供任何查询功能
public static int getCount() { return count; }
//idCount,count只允许在存储重新读取时清零,不允许获取
public static void setCount() { Book.idCount = 0; Book.count=0;}
}
Menu:
package Work;
import java.util.ArrayList;
import java.util.Scanner;
/******菜单页面*****/
public class Menu {
/**
* 菜单方法,所有的功能入口,使用本程序只需在main方法中创建本类对象即可.
*/
public Menu() {
//创建图书操作类对象
ChangeBook change = new ChangeBook();
//创建图书排序类对象
BookList bList = new BookList();
Scanner sc = new Scanner(System.in);
//创建图书列表(初始数据从文件导入)
ArrayList list = change.read();
while(true){
System.out.println("================================");
System.out.println(" 图书管理系统\n");
System.out.println(" 1.查看图书列表");
System.out.println(" 2.添加图书");
System.out.println(" 3.图书排行");
System.out.println(" 4.退出系统\n");
System.out.println(" 请选择服务项目\n ");
switch (sc.nextInt()){
case 1:change.printList(list);//先打印列表
change.search(list);//再查询
break;
case 2:change.insert(list);//插入方法
break;
case 3:bList.demo(list);//排序方法
break;
default:System.exit(0);
break;
}
//文件重新存储读取,刷新数据
change.write(list);
list = change.read();
}
}
}
ChangBook:
package Work;
import java.io.*;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Scanner;
/******图书查询、修改、创建、存储*****/
public class ChangeBook {
/**
* 此方法用于修改指定图书信息,传入图书列表和所需修改图书id即可.
* @param list 图书列表
* @param id 图书id
*/
//修改
public void change(ArrayList list, String id){
int c;
String str;
double d;
Scanner sc = new Scanner(System.in);
System.out.println("确认修改 ‘" + id + "’这本书吗?(键入1确认)");
c = sc.nextInt();
if(c==1){
for (Book book : list) {
if (book.getId().equals(id)) {
System.out.println(book.toString());
System.out.println("请输入图书新的name(输入-1,不修改):");
str = sc.next();
//记录修改信息
String s = ("message: 修改图书 " + book.getName() + " 信息\ntime: "
+ Calendar.getInstance().getTime() + "\n");
if (!str.equals("-1")) {
s += "name: ‘" + book.getName() + "’ --> ‘";
book.setName(str);
s += book.getName() + "’\n";
}
System.out.println("请输入图书新的author:");
str = sc.next();
if (!str.equals("-1")) {
s += "author: ‘" + book.getAuthor() + "’ --> ‘";
book.setAuthor(str);
s += book.getAuthor() + "’\n";
}
System.out.println("请输入图书新的price:");
d = sc.nextDouble();
if (!(d + "").equals("-1")) {
s += "price: ‘" + book.getPrice() + "’ --> ‘";
book.setPrice(d);
s += book.getPrice() + "’\n";
}
System.out.println("请输入图书新的url:");
str = sc.next();
if (!str.equals("-1")) {
s += "url: ‘" + book.getUrl() + "’ --> ‘";
book.setUrl(str);
s += book.getUrl() + "’\n";
}
System.out.println("修改完毕(id不可以修改)!");
System.out.println(book.toString());
s += "\n---------------------------------------\n";
record(s);//记录修改信息
return;
}
}
}else {
System.out.println("已经取消修改!");
}
}
/**
* 此方法用于打印图书列表.
* @param list 图书列表
*/
//打印列表
public void printList(ArrayList list){
System.out.println("\n\n《图书列表》\n");
System.out.println("ID\t\t\t\tName\t\t\t\tAuthor\t\t\t\tPrice\t\tURL");
//遍历book列表,并打印对应属性
for(Book book:list){
System.out.println(book.getId()+"\t\t"+book.getName()+"\t\t\t\t"
+book.getAuthor()+"\t\t\t\t"+book.getPrice()+"\t\t"+book.getUrl());
}
}
/**
* 此方法用于查询图书,此方法会自动调用“打印图书列表”方法,方便用户查询.
* 再查询到对应图书后,用户可以选择进行修改或者删除操作.
* @param list 图书列表
*/
//查询
public void search(ArrayList list){
Scanner sc = new Scanner(System.in);
String str,demoStr;
while(true){
System.out.println("\n\n请输入您想要查询的图书的“name”或者“id”(输入“-1”退出查询系统):");
str=sc.next();
boolean flag = false;
if(str.equals("-1")){
return;
}
else{
//不适用 for-each 因为可能出现删除操作
for(int i=0;i list){
String str;
double d;
Scanner sc = new Scanner(System.in);
while(true){
boolean flag = true;//判断图书名称是否合法
System.out.println("输入-1退出增加图书,输入0可以导入demo数据(输入其他内容则继续添加):");
str = sc.next();
if(str.equals("-1")){
return;
}else if(str.equals("0")){
createDemo(list);
return;
}
Book book = new Book();
System.out.println("请输入您要添加的图书的name:");
str = sc.next();
for(Book bookDemo:list){//图书名称不得重复
if(bookDemo.getName().equals(str)){
System.out.println("已经存在此图书,请勿添加重复图书。\n" +
"若是在那个要添加同名书籍,请在书名后方加上大写字母区分\n");
flag = false;
break;
}
}
if(flag){
book.setName(str);
System.out.println("请输入您要添加的图书的author:");
str = sc.next();
book.setAuthor(str);
System.out.println("请输入您要添加的图书的price:");
d = sc.nextDouble();
book.setPrice(d);
System.out.println("请输入您要添加的图书的url:");
str = sc.next();
book.setUrl(str);
System.out.println(book.toString());
list.add(book);
String s = ("message: 创建图书 " + book.getName() + "\ntime: "
+ Calendar.getInstance().getTime()
+ "\n\n---------------------------------------\n");
record(s);//记录创建信息
}
}
}
/**
* 本方法用于删除图书,传入图书列表和所需删除图书的id.
* @param list 图书列表
* @param id 图书id
*/
//删除
public void delete(ArrayList list, String id){
int c;
Scanner sc = new Scanner(System.in);
System.out.println("确认删除 ‘" + id + "’这本书吗?(键入1确认)");
c = sc.nextInt();
if(c==1){
for(int i=0; i list){
Book book1 = new Book("三国演义", "罗贯中",39.99,"www.bookPlus.com");
Book book2 = new Book("西游记", "吴承恩",49.99,"www.bookNice.com");
Book book3 = new Book("红楼梦", "曹雪芹",49.99,"https://blog.csdn.net/may10?spm=1000.2115.3001.5343");
Book book4 = new Book("水浒传", "施耐庵",29.99,"www.bookOJBK.com");
//list.add(book1);
//list.add(book2);
//list.add(book3);
//list.add(book4);
//list.addAll(book1,book2,book3,book4);
Collections.addAll(list,book1,book2,book3,book4);
String str = ("message: 图书列表导入demo数据.\ntime: "
+ Calendar.getInstance().getTime()
+ "\n\n---------------------------------------\n");
record(str);//记录导入信息
}
/**
* 读取图书列表方法,存储文件“data\\BookObject.txt”.
* 若此文件或者目录不存在则自动创建.
* @return 返回从文件中读取的信息并存入列表
*/
//读取
public ArrayList read(){
//初始化Book类的count和idCount
Book.setCount();
//创建图书列表
ArrayList list = new ArrayList<>();
//创建目录对象
File data = new File("data");
//如果目录不存在则创建目录
if(!data.exists()){
boolean b1 = data.mkdir();
}
//创建文件对象
File file = new File(data+"\\BookObject.txt");
try{
//如果文件不存在则创建文件
if(!file.exists()){
boolean b2 = file.createNewFile();
}
//创建字符输入流对象
FileReader fr = new FileReader(file);
//创建字符缓存输入流对象
BufferedReader br = new BufferedReader(fr);
String string;
//循环读取文件
while((string = br.readLine())!=null){
//将读取到的string切割
String[] s = string.split("\t\t\t\t");
//创建图书对象,从文件中获取属性(id不获取,系统每次重新分配)
Book book = new Book(s[1], s[2], Double.parseDouble(s[3]), s[4]);
//将图书对象存入集合
list.add(book);
}
//释放资源
br.close();
System.out.println("读取数据成功");
}catch (Exception e){
e.printStackTrace();
}
return list;
}
/**
* 存储图书列表方法,存储文件“data\\BookObject.txt”.
* 若此文件或者目录不存在则自动创建.
* @param list 图书列表
*/
//存储
public void write(ArrayList list) {
//创建目录对象
File data = new File("data");
//如果目录对象不存在则创建目录
if(!data.exists()){
boolean b1 = data.mkdir();
}
//创建文件对象
File file = new File(data+"\\BookObject.txt");
try {
//如果文件不存在则创建文件
if(!file.exists()){
boolean b2 = file.createNewFile();
}
//创建字符输出流对象
FileWriter fw = new FileWriter(file);
//创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(fw);
//循环存入book对象属性
for(Book book:list){
bw.write(book.getId());
bw.write("\t\t\t\t");
bw.write(book.getName());
bw.write("\t\t\t\t");
bw.write(book.getAuthor());
bw.write("\t\t\t\t");
bw.write(book.getPrice()+"");
bw.write("\t\t\t\t");
bw.write(book.getUrl());
//换行
bw.newLine();
}
//刷新并释放资源
bw.flush();
bw.close();
System.out.println("存储数据成功");
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 记录图书信息变更方法,记录文件“data\\MessageRecord.txt”.
* 若此文件或者目录不存在则自动创建.
* @param str 信息变更记录
*/
//图书信息改变记录表
public void record(String str){
//创建目录对象
File data = new File("data");
//如果目录对象不存在则创建目录
if(!data.exists()){
boolean b1 = data.mkdir();
}
//创建文件对象
File file = new File(data+"\\MessageRecord.txt");//信息记录文件
try {
//如果文件不存在则创建文件
if(!file.exists()){
boolean b2 = file.createNewFile();
}
//创建字符输出流对象
FileWriter fw = new FileWriter(file, true);//追加
//创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(fw);
//存入记录
bw.write(str);
bw.newLine();
//刷新并释放资源
bw.flush();
bw.close();
System.out.println("存储数据成功");
}catch (Exception e){
e.printStackTrace();
}
}
}
BookList:
package Work;
import java.util.*;
/******图书排序类*****/
public class BookList {
/**
* 此方法用于给图书列表排序,提供价格升序和价格降序两种排序方式.
* @param list 图书列表
*/
//图书排序
public void demo(ArrayList list){
ChangeBook change = new ChangeBook();
int s;
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("\n请选择排序方式(1.价格升序,2.价格降序,-1.退出排序):");
s = sc.nextInt();
if(s==1){
//集合排序,价格升序
list.sort(new Comparator() {
@Override
public int compare(Book o1, Book o2) {
return (int) o1.getPrice() - (int) o2.getPrice();
}
});
change.printList(list);
}else if(s==2){
//集合排序,价格降序
list.sort(new Comparator() {
@Override
public int compare(Book o1, Book o2) {
return (int) o2.getPrice() - (int) o1.getPrice();
}
});
change.printList(list);
}else{
return;
}
}
}
}