系统介绍
Java基础练习,随手记系统。实现账单的增删改查功能
模块功能介绍
账单类
package cn.tx;
/*
* ID 类别 账户 类型 金额 时间 备注
*/
public class Bills {
private String name;
private String account; //支出 收入方式
private String type; // 支出 收入
private Double total; //金额
private String time;
private String desc; //备注
public Bills(){
}
public Bills(String name, double total, String account, String type, String time, String desc) {
this.name = name;
this.account = account;
this.type = type;
this.total = total;
this.time = time;
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
数据存储以及初始化
这里我们采用List列表来存储Bills类对象,同时在static代码块中初始化部分账单数据
// 创建一个集合来存储, 数组
static List<Bills> billsList = new ArrayList<>();
// 类加载的时候会第一时间执行, 在billsList中加入初始化数据
static {
billsList.add(new Bills("吃饭支出",247,"交行","支出","2021-03-01","家庭聚餐"));
billsList.add(new Bills("吃饭支出",247,"交行","支出","2021-03-01","家庭聚餐"));
billsList.add(new Bills("工资收入",12345,"现金","收入","2021-03-03","发工资"));
billsList.add(new Bills("交通支出",200,"交行","支出","2021-03-04","交通出行"));
billsList.add(new Bills("股票收入",5000,"交行","收入","2021-03-05","股票涨"));
billsList.add(new Bills("礼金支出",1000,"现金","支出","2021-03-06","朋友结婚"));
}
打印输出方法
private static void print(List<Bills> billsList){
System.out.println("IC\t\t类别\t\t\t账户\t\t类型\t\t金额\t\t\t时间\t\t\t\t备注");
for (int i = 0; i < billsList.size(); i++) {
Bills bills = billsList.get(i);
System.out.println(i+1+"\t\t"+bills.getName()+"\t\t"+bills.getAccount()+"\t\t"+bills.getType()+"\t\t"+
bills.getTotal()+"\t\t"+bills.getTime()+"\t\t"+bills.getDesc());
}
}
添加账单
private static void addBills(){
Scanner scanner = new Scanner(System.in);
Bills bills = new Bills();
System.out.println("请输入类别:");
bills.setName(scanner.next());
System.out.println("请输入账户:");
bills.setAccount(scanner.next());
System.out.println("请输入支出收入类型:");
bills.setType(scanner.next());
System.out.println("请输入金额:");
bills.setTotal(scanner.nextDouble());
System.out.println("请输入时间:");
bills.setTime(scanner.next());
System.out.println("请输入备注:");
bills.setDesc(scanner.next());
billsList.add(bills);
System.out.println("添加账务成功!");
}
删除账单
private static void delBills(){
System.out.println("请输入需要删除的序号");
Scanner scanner = new Scanner(System.in);
int id = scanner.nextInt();
billsList.remove(id-1);
System.out.println("删除成功");
}
查询账单
/*
* 三种查询 1、查询所有 2、按照时间区间查询 3、收入和支出的类型查询
* */
private static void select(){
System.out.println("随手记>>账务查询:");
System.out.println("1、查询所有 2、按照时间区间查询 3、收入和支出的类型查询");
// 创建扫描器
Scanner scanner = new Scanner(System.in);
int op = scanner.nextInt();
switch (op){
case 1:
selectAll();
break;
case 2:
selectByDate();
break;
case 3:
selectByType();
break;
}
}
分别实现三种查询
显示账单全部内容
private static void selectAll(){
print(billsList);
}
根据收入与支出来进行账单的查询,这里使用了lambda表达式,可以理解为将billsList对象转换成stream流,用filter进行条件筛选,()中,bills相当于形参,代指billsList中的每一个对象,返回值为真时,保留该对象。之后再collect方法将stream流转回List即可
private static void selectByType(){
System.out.println("随手记>>账务查询>>收入和支出的类型:");
// 创建扫描器
Scanner scanner = new Scanner(System.in);
String op = scanner.next();
// lambda 表达式
List<Bills> billsList1 = billsList.stream().filter(bills -> {
String type = bills.getType();
return type.equals(op);
}).collect(Collectors.toList());
print(billsList1);
}
与上述类似,不过采用了SimpleDateFormat类对时间格式进行了处理
private static void selectByDate(){
//创建一个时间格式化的对象
SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd");
System.out.println("随手记>>账务查询>>按照时间区间来查询:");
// 创建扫描器
Scanner scanner = new Scanner(System.in);
System.out.println("请输入开始时间,格式YYYY-MM—DD");
String start = scanner.next();
System.out.println("请输入结束时间,格式YYYY-MM-DD");
String end = scanner.next();
List<Bills> billsList1 = billsList.stream().filter(bills -> {
String time = bills.getTime();
// 把字符串解析成具体的时间
try {
Date startDate = format.parse(start);
Date endDate = format.parse(end);
Date timeDate = format.parse(time);
if (timeDate.before(endDate) && timeDate.after(startDate)) {
return true;
}
} catch (ParseException e) {
e.printStackTrace();
}
return false;
}).collect(Collectors.toList());
print(billsList1);
}
主界面方法
public static void run(){
// 创建一个flag标志,用于退出系统的标志
boolean flag = true;
while(flag) {
System.out.println("---------------随手记----------------");
System.out.println("1.添加账务 2.删除账务 3.查询账务 4.退出系统");
System.out.println("请输入功能序号【1-4】:");
//创建扫描器
Scanner scanner = new Scanner(System.in);
// 获得输入的选项
int op = scanner.nextInt();
// 判断1,2,3,4
switch (op) {
case 1:
addBills();
break;
case 2:
delBills();
break;
case 3:
select();
break;
case 4:
System.out.println("退出系统:");
flag = false;
break;
default:
System.out.println("请重新输入:");
}
}
}