目录
前言
一、定义存储数据的类
二、菜单
三、创建集合
四、添加账务
五、查询账务
1.查询所有
2.按时间区间查询
3.按类型查询
六、删除账务
七、完整代码
前言
作为java初学者,程序里面可能会有一些写的不好的地方,请见谅。作为一个从C++转Java的初学者,还不会使用Java中的文件读写,所以后面的代码中,是将数据存储在一个列表中的,而一般涉及大量数据存储的程序,一般是将数据存储在数据库或者文件中的。好啦,不说了,我们开始吧~
一、定义存储数据的类
定义一个Bills类用来存储记录,记录一条账务,我们需要有:账务类别、金额、使用的账户、收入或支出类型、时间、备注。
直接看代码吧。
public class Bills {
private String name; //类别
private double total; //金额
private String account; //账户
private String type; //类型
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.total = total;
this.account = account;
this.type = type;
this.time = time;
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
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 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;
}
}
二、菜单
记账程序主要有添加账务、删除账务、查询账务、退出系统这几个基本功能。菜单我们直接打印就行了。
public static void showMain()
{
System.out.println("----------------------随手记----------------------");
System.out.println("1.添加账务 2.删除账务 3.查询账务 4.退出系统");
System.out.println("请输入功能序号【1-4】");
}
有了菜单后,我们还需要根据菜单选择对应的功能,然后执行该功能。所以我们需要用户输入自己的选择,然后使用switch-case语句判断。
public static void run()
{
showMain();
boolean flag=true;
//创建扫描器
Scanner scanner=new Scanner(System.in);
while(flag)
{
//获得输入的选项
int op=scanner.nextInt();
switch (op){
case 1:
addBills();
break;
case 2:
delBills();
break;
case 3:
select();
break;
case 4:
flag=false;
break;
default:
System.out.println("请重新输入:");
}
}
System.out.println("退出系统");
}
三、创建集合
在开始对于数据的操作之前,我们还需要创建一个集合来存储数组,而数组中就是我们初始化的账务数据。
static List<Bills> billList=new ArrayList<>();
static {
billList.add(new Bills("吃饭支出",247,"交行","支出","2021-03-02","家庭聚餐"));
billList.add(new Bills("吃饭支出",247,"交行","支出","2021-03-02","家庭聚餐"));
billList.add(new Bills("工资收入",12345,"现金","收入","2021-03-15","发工资"));
billList.add(new Bills("交通支出",100,"交行","支出","2021-03-20","坐高铁"));
}
四、添加账务
创建一个Bills对象来存储用户输入的临时数据,然后将这条数据追加到集合中。
private static void addBills()
{
Scanner inScanner=new Scanner(System.in);
Bills bills=new Bills();
System.out.println("请输入类别:");
bills.setName(inScanner.next());
System.out.println("请输入账户:");
bills.setAccount(inScanner.next());
System.out.println("请输入支出类型:");
bills.setType(inScanner.next());
System.out.println("请输入金额:");
bills.setTotal(inScanner.nextDouble());
System.out.println("请输入时间:");
bills.setTime(inScanner.next());
System.out.println("请输入备注:");
bills.setDesc(inScanner.next());
billList.add(bills);
System.out.println("添加账务成功!");
showMain();
}
五、查询账务
和刚才的菜单选择一样,我们需要先判断用户选择的是哪种查询,有三种查询方式: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;
}
//展示上一级的主菜单
showMain();
}
1.查询所有
我们需要先设置打印的格式。
public static void print(List<Bills> billsList)
{
System.out.println("ID\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 selectAll()
{
print(billList);
}
2.按时间区间查询
private static void selectByDate()
{
//创建一个时间格式化的对象
SimpleDateFormat format=new SimpleDateFormat("yyy-MM-dd");
System.out.println("随手记>>账务查询>>按照时间区间来查询");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入:开始时间");
String start=scanner.next();
System.out.println("请输入:结束时间");
String end=scanner.next();
List<Bills> billsList=billList.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(billsList);
}
3.按类型查询
private static void selectByType()
{
System.out.println("随手记>>账务查询>>收入和支出的类型");
System.out.println("请输入:收入或者支出");
Scanner scanner=new Scanner(System.in);
//收入,支出
String type=scanner.next();
//集合stream流,集合的筛选
List<Bills> billsList=billList.stream()
.filter(bills -> {
String type1=bills.getType();
return type1.equals(type);
}).collect(Collectors.toList());
print(billsList);
}
六、删除账务
private static void delBills()
{
Scanner inScanner=new Scanner(System.in);
int id=inScanner.nextInt();
billList.remove(id-1);
System.out.println("删除成功!");
showMain();
}
七、完整代码
Bills.java
package cn.tx;
public class Bills {
private String name; //类别
private double total; //金额
private String account; //账户
private String type; //类型
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.total = total;
this.account = account;
this.type = type;
this.time = time;
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
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 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;
}
}
MainMenu.java
package cn.tx;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class MainMenu {
//创建一个集合来存储数组
static List<Bills> billList=new ArrayList<>();
//类加载时会第一时间执行,在billList里面加入初始化数据
static {
billList.add(new Bills("吃饭支出",247,"交行","支出","2021-03-02","家庭聚餐"));
billList.add(new Bills("吃饭支出",247,"交行","支出","2021-03-02","家庭聚餐"));
billList.add(new Bills("工资收入",12345,"现金","收入","2021-03-15","发工资"));
billList.add(new Bills("交通支出",100,"交行","支出","2021-03-20","坐高铁"));
}
public static void main(String[] args){
run();
}
public static void showMain()
{
System.out.println("----------------------随手记----------------------");
System.out.println("1.添加账务 2.删除账务 3.查询账务 4.退出系统");
System.out.println("请输入功能序号【1-4】");
}
public static void run()
{
showMain();
boolean flag=true;
//创建扫描器
Scanner scanner=new Scanner(System.in);
while(flag)
{
//获得输入的选项
int op=scanner.nextInt();
switch (op){
case 1:
addBills();
break;
case 2:
delBills();
break;
case 3:
select();
break;
case 4:
flag=false;
break;
default:
System.out.println("请重新输入:");
}
}
System.out.println("退出系统");
}
private static void delBills()
{
Scanner inScanner=new Scanner(System.in);
int id=inScanner.nextInt();
billList.remove(id-1);
System.out.println("删除成功!");
showMain();
}
private static void addBills()
{
Scanner inScanner=new Scanner(System.in);
Bills bills=new Bills();
System.out.println("请输入类别:");
bills.setName(inScanner.next());
System.out.println("请输入账户:");
bills.setAccount(inScanner.next());
System.out.println("请输入支出类型:");
bills.setType(inScanner.next());
System.out.println("请输入金额:");
bills.setTotal(inScanner.nextDouble());
System.out.println("请输入时间:");
bills.setTime(inScanner.next());
System.out.println("请输入备注:");
bills.setDesc(inScanner.next());
billList.add(bills);
System.out.println("添加账务成功!");
showMain();
}
//三种查询 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;
}
//展示上一级的主菜单
showMain();
}
private static void selectAll()
{
print(billList);
}
private static void selectByDate()
{
//创建一个时间格式化的对象
SimpleDateFormat format=new SimpleDateFormat("yyy-MM-dd");
System.out.println("随手记>>账务查询>>按照时间区间来查询");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入:开始时间");
String start=scanner.next();
System.out.println("请输入:结束时间");
String end=scanner.next();
List<Bills> billsList=billList.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(billsList);
}
private static void selectByType()
{
System.out.println("随手记>>账务查询>>收入和支出的类型");
System.out.println("请输入:收入或者支出");
Scanner scanner=new Scanner(System.in);
//收入,支出
String type=scanner.next();
//集合stream流,集合的筛选
List<Bills> billsList=billList.stream()
.filter(bills -> {
String type1=bills.getType();
return type1.equals(type);
}).collect(Collectors.toList());
print(billsList);
}
public static void print(List<Bills> billsList)
{
System.out.println("ID\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());
}
}
}