前言

之前已经写过关于 学生成绩管理系统 以及 点菜系统 的文章,大家如果感兴趣,可以点击各自的传送门去看看呀!

接下来开始我们今天的正题,我们日常生活中,想必有很多人都有记账的习惯,那今天,我们就来看看,如何设计并实现一个记账本。

需求分析

打开我们手机里的记账本,可以发现主要提供如下几个功能:

  1. 添加账目
  2. 删除账目
  3. 修改账目
  4. 查询账目
    • 查询所有账目
    • 按时间区间查询
    • 按账目类型查询
  5. 退出记账本

功能预览及代码实现

主菜单

主菜单中,主要用于打印提示我们进行选择,然后根据我们的输入再进入不同的子功能模块中。

  • 预览

  • 代码实现

代码实现很简单,只需要打印出提示信息即可,之后后续输入以及进入不同子功能模块,我们可以使用 switch 来进行选择。

package com.cunyu;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;/*** Created with IntelliJ IDEA.** @author : 村雨* @version : 1.0* @project : Java 实战* @package : com.cunyu* @className : MainApp* @createTime : 2021/8/1 7:22* @email : 747731461@qq.com* @公众号 : 村雨遥* @website : https://cunyu1943.github.io* @description :*/
public class MainApp {public static void main(String[] args) {boolean flag = true;while (flag) {System.out.println("----------欢迎使用记账系统--------");System.out.println("----------【1】添加账务----------");System.out.println("----------【2】删除账务----------");System.out.println("----------【3】修改账务----------");System.out.println("----------【4】查询账务----------");System.out.println("----------【0】退出-------------");System.out.println("请输入功能序号【0-4】");}System.out.println("退出系统,期待下次见面 ~");}
}

添加账目

当我们需要添加一笔新的账目时,此时就可以进入 添加账目 子模块,这里的功能主要是根据我们自己输入的 ID、类别、账户、类型、金额、时间以及备注将其添加到我们的总账目列表中进行汇总。

  • 预览

  • 代码实现

要实现添加功能也很简单,根据我们的输入,我们利用账目类的构造函数创建一个对象,然后将其加入总账目列表当中就可以了。

public void add(List<Bill> billList, int id, String category, String account, String type, double amount, String time, String desc) {//创建一个账单对象,然后将其加入列表Bill bill = new Bill(id, category, account, type, amount, time, desc);billList.add(bill);
}

删除账目

假如我们的账目要公开给别人看,而自己有的账目又不想让别人看到,咋办呢?很简单!我们只需要将这笔账目干掉即可!这里我们只要输入我们所要删除的账单 ID,然后将其从总账目列表中删除即可。

  • 预览

  • 代码实现

要删除我们的账目,只需要根据我们输入的账单 id,找到对应 id 的账目,然后将其删除即可,这里之所以没有使用 remove(index) 的方式,是因为我们的 id 是自己输入的,这其实是不规则的,如果我们使用 remove(index) 的方式,就有可能导致越界的问题。

public void del(List<Bill> billList, int id) {//找到对应 id 的账单,并将其删除for (Bill bill : billList) {if (bill.getId() == id) {billList.remove(bill);}}
}

修改账目

我们偷偷拿了私房钱买了猛男必备显卡(RTX 3090)想趁空了打打游戏,遇到老婆查账时,这时候可不能慌,我们只需要把账单偷梁换柱,改换成其他东西就可以,而且此事神不知鬼不觉,美滋滋呀!

  • 预览

  • 代码实现

利用代码实现也很简单,找到对应 ID 的账单,然后重新输入账单各个细节进行修改即可!

public void modify(List<Bill> billList) {Scanner scanner = new Scanner(System.in);System.out.println("输入你要修改对应账务的 ID");int id = scanner.nextInt();System.out.println("请输入修改后的账务类别");String category = scanner.next();System.out.println("请输入修改后的账户");String account = scanner.next();System.out.println("请输入修改后的类型(收入/支出)");String type = scanner.next();System.out.println("请输入修改后的金额");double amount = scanner.nextDouble();System.out.println("请输入修改后的时间");String time = scanner.next();System.out.println("请输入修改后的备注");String description = scanner.next();//找到对应 id 的账单,然后修改对应信息for (Bill bill : billList) {if (bill.getId() == id) {bill.setCategory(category);bill.setAmount(amount);bill.setAccount(account);bill.setTime(time);bill.setType(type);bill.setDesc(description);}}}

查询账目

查询账目这里,我们又分为 3 个不同的功能,既可以查看所有账单,也可以根据我们所输入的时间区间进行筛选,最后,还能够根据我们的输入查询出收入和支出的详细情况。

查询所有账目

  • 预览

  • 代码实现

查询所有账单很简单,只需要遍历我们总账单列表即可。

public void queryAll(List<Bill> billList) {System.out.println("ID\t\t类别\t\t\t账户\t\t类型\t\t金额\t\t\t时间\t\t\t\t备注");for (Bill bill : billList) {System.out.println(bill.getId() + "\t\t" + bill.getCategory() + "\t\t" + bill.getAccount() + "\t\t" + bill.getType() + "\t\t" + bill.getAmount() + "\t\t" + bill.getTime() + "\t\t" + bill.getDesc());}
}

按时间区间查询

  • 预览

  • 代码实现

按照时间跨度来查询稍微要麻烦一些,这里要处理两个输入,一个是开始时间,一个是结束时间,我们需要将账单的时间和这两个时间进行比较,筛选出介于这两者之间的账单。所以这里要涉及到 Date 类,然后就是如何从总账单列表中过滤出满足时间跨度的账单。

public void queryByTime(List<Bill> billList, String startTime, String endTime) {// 时间格式化SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");List<Bill> bills = billList.stream().filter(bill -> {String tmpTime = bill.getTime();try {// 将输入的时间字符串转换为格式化的 Date 类型Date tmpDate = simpleDateFormat.parse(tmpTime);Date startDate = simpleDateFormat.parse(startTime);Date endDate = simpleDateFormat.parse(endTime);// 将介于开始时间和结束时间的账单进行过滤if (tmpDate.before(endDate) && tmpDate.after(startDate)) {return true;}} catch (ParseException parseException) {parseException.printStackTrace();}return false;//    将其转换为列表}).collect(Collectors.toList());queryAll(bills);
}

按类型查询

  • 预览

  • 代码实现

这里按类型查询其实就是在查询所有账单的基础上加上一个限制条件,只要其类型等于我们的输入即可,这里我写了两种筛选的方法。一种是直接使用 if 语句进行过滤,而另一种则是同按时间跨度一样使用集合的 Stream 流来进行过滤。

public void queryByType(List<Bill> billList, String type) {//1. 第一种方式,利用条件判断//for (Bill bill : billList) {//    if (bill.getType().equals(type)) {//        System.out.println(bill.getId() + "\t\t" + bill.getCategory() + "\t\t" + bill.getAccount() + "\t\t" + bill.getType() + "\t\t" + bill.getAmount() + "\t\t" + bill.getTime() + "\t\t" + bill.getDesc());//    }//}//2. 第二种方式,利用集合 Stream 流List<Bill> bills = billList.stream().filter(bill -> {String tmpType = bill.getType();return tmpType.equals(type);}).collect(Collectors.toList());queryAll(bills);
}

退出系统

  • 预览

  • 代码实现

在主菜单中,我们已经设置了一个标志位 flag,当 flagtrue 时,我们每完成一项功能则循环打印主菜单在控制台中,而如果我们想要退出系统,只需要将标志位 flag 设置为 false 即可,此时不满足 while 循环的条件,所以跳出循环,因此退出系统的关键在于标志位状态的转换。

case "0":flag = false;break;

整体程序

将各个子模块功能实现之后,剩下的就是整合工作了,最后得到我们最后的总体程序结构如下,主要代码均位于 com.cunyu 包下,然后分别是:

  • 实体类 Bill
  • 接口类 IBill
  • 主程序 MainApp

总结

好了,以上就是我们简单的记账本的实现了。实现的功能比较简陋,程序的健壮性也不够强,还有很大的优化空间。大家如果感兴趣或者有优化的地方,欢迎到本设计的 Github 仓库地址:https://github.com/cunyu1943/java-in-actions 提交 issue。当然了,如果你只是需要用来简单的做个示例,也可以自取。

最后,如果本文对大家有用的话,希望给我一个⭐ star,满足一下我的虚荣心呀 ~

徒手撸一个记账本(附源码)相关推荐

  1. Shark(鲨鱼记账系统)--附源码

    Shark(鲨鱼记账系统)–附源码 程序员就要多撸代码,以便在脑海中形成深刻记忆,昨晚试着撸了一个小小的记账系统,内容很简单,主要负责简单的记账,不过没用到持久层,后续会做持久层的版本,先看个简单的把 ...

  2. 酸爽,最近又帮业务方制作了一个数据看板(附源码)

    事情是这样的,最近接到了这样的业务需求,需要在地图上将我司船舶的轨迹展示出来.听起来很简单,一开始我也是这样想的.通过一些BI工具应该可以轻松实现,比如这样的: 仔细观察可以看到,这种轨迹是两点之前的 ...

  3. php如何生成一年的日历表_使用php动态生成一个日历,附源码。【简单实用】

    日历在web开发中是非常常用的一个功能,网上搜也能找到一大堆日历组件,大部分是js组件. 因为再开发过程中需要使用到日历的功能,又不想下载什么日历组件.所以就自己动手写了一个简单的php生成日历的功能 ...

  4. SpringBoot做的两个系统,一个时间定时任务(quartz),一个微信签到(附源码)

    简单的两个SpringBoot Demo ps:有什么不懂的可以直接提出来,我可以一一解答,如quartz如何对SpringBoot进行依赖注入等等这些问题都可以的,需要的话我收集问题专门写一篇文章解 ...

  5. 教你用100多行写一个数据库(附源码)

    本文介绍的是以为中国的IT资深人士写的一个简单的数据库,没有我们使用的数据库那么强大,但是值得大家借鉴.可以用在特定环境中,更加灵活方便. 数据库的名字叫WawaDB,是用python实现的.由此可见 ...

  6. python3 mysql代码行_教你用100多行写一个数据库(附源码)|python3教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 本文介绍的是以为中国的IT资深人士写的一个简单的数据库,没有我们使用的数据库那么强大,但是值得大家借鉴.可 ...

  7. C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码

    2019独角兽企业重金招聘Python工程师标准>>> 我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错.为了更便 ...

  8. 【Golang项目实战】手把手教你写一个备忘录程序|附源码——建议收藏

    博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作.目前在学习和分享:数据结构.Go,Java等相关知识. 博主主页: @是瑶瑶子啦 所属专栏: Go语言核心编程 近期目标:写好专栏的每一篇文 ...

  9. 看看人家那智能在线爬虫系统,那叫一个优雅(附源码)!

  10. spring boot 自动跳转登录页面_徒手撸一个扫码登录示例工程

    徒手撸一个扫码登录示例工程 不知道是不是微信的原因,现在出现扫码登录的场景越来越多了,作为一个有追求.有理想新四好码农,当然得紧跟时代的潮流,得徒手撸一个以儆效尤 本篇示例工程,主要用到以下技术栈 q ...

最新文章

  1. 对标Bert?刷屏的GPT 2.0意味着什么
  2. python strptime_Python法律实务应用——制作自己的LPR计算器(上)
  3. CentOS7攻克日记(三) —— 安装Python3.6
  4. 深入了解MyBatis返回值
  5. 当内容超出最大的长度的时候,使用CSS使文本显示省略号
  6. No.10 awk、变量、运算符、if多分支
  7. 如何隐藏地址栏中的真实地址_Firefox推出Private Relay插件:可隐藏真实邮箱地址...
  8. VIM打造GTK编程环境
  9. 如何在Spyder中使用远程服务器的python来调试代码
  10. Golang 笔记 2 函数、结构体、接口、指针
  11. 蓝桥杯 BASIC-9 特殊回文数
  12. BZOJ3680 吊打XXX
  13. c语言中有123f,C语言库函数(S类字母) - 3
  14. layui图片放大功能
  15. 云和恩墨大讲堂西安站成功举办,携手合作伙伴引领企业数字化转型
  16. android最佳投屏,Android投屏神器(scrcpy使用教程)
  17. Zotero + 坚果云 文献管理器配置
  18. 胡闹厨房2 for Mac厨房模拟游戏又名煮糊了2
  19. 手机 android.downloader病毒,downloader病毒是什么
  20. 家庭备忘记事便签软件哪个实用?

热门文章

  1. UT2015学习笔记
  2. 799-C++异常类型以及多级catch匹配
  3. DB2活动日志占用过大
  4. 持续更新 iText in Action 2nd Edition中文版 个人翻译
  5. python一款高颜值的词云包让我拍案叫绝
  6. 折弯机使用说明书_折弯机操作图解法-如何使用折弯机
  7. 计算不规则四边形(多边形)的面积
  8. 怎么用阿里云服务器部署项目?上传简单项目
  9. 实验吧安全杂项WP(一)
  10. OSPF协议总结5(六种LSA)