<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          徒手擼一個記賬本(附源碼)

          共 6036字,需瀏覽 13分鐘

           ·

          2021-08-11 23:53

          本文已收錄至:https://cunyu1943.blog.csdn.net/

          前言

          之前已經(jīng)寫過關(guān)于 學生成績管理系統(tǒng) 以及 點菜系統(tǒng) 的文章,大家如果感興趣,可以點擊各自的傳送門去看看呀!

          接下來開始我們今天的正題,我們?nèi)粘I钪?,想必有很多人都有記賬的習慣,那今天,我們就來看看,如何設(shè)計并實現(xiàn)一個記賬本。

          需求分析

          打開我們手機里的記賬本,可以發(fā)現(xiàn)主要提供如下幾個功能:

          1. 添加賬目
          2. 刪除賬目
          3. 修改賬目
          4. 查詢賬目
          • 查詢所有賬目
          • 按時間區(qū)間查詢
          • 按賬目類型查詢
          退出記賬本256019b3fe7a8255040a0ae625ff72b2.webp記賬本

          功能預覽及代碼實現(xiàn)

          主菜單

          主菜單中,主要用于打印提示我們進行選擇,然后根據(jù)我們的輸入再進入不同的子功能模塊中。

          • 預覽
          e2b3c106193e19b86eb07eef43c008a2.webp
          • 代碼實現(xiàn)

          代碼實現(xiàn)很簡單,只需要打印出提示信息即可,之后后續(xù)輸入以及進入不同子功能模塊,我們可以使用 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?實戰(zhàn)
          ?*?@package?:?com.cunyu
          ?*?@className?:?MainApp
          ?*?@createTime?:?2021/8/1?7:22
          ?*?@email?:[email protected]
          ?*?@公眾號?:?村雨遙
          ?*?@website?:?https://cunyu1943.github.io
          ?*?@description?:
          ?*/

          public?class?MainApp?{

          ????public?static?void?main(String[]?args)?{

          ????????boolean?flag?=?true;
          ????????while?(flag)?{
          ????????????System.out.println("----------歡迎使用記賬系統(tǒng)--------");
          ????????????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("退出系統(tǒng),期待下次見面?~");
          ????}
          }

          添加賬目

          當我們需要添加一筆新的賬目時,此時就可以進入 添加賬目 子模塊,這里的功能主要是根據(jù)我們自己輸入的 ID、類別、賬戶、類型、金額、時間以及備注將其添加到我們的總賬目列表中進行匯總。

          • 預覽
          5761a6ae70e2fa093882fe19a922674b.webp添加賬目
          • 代碼實現(xiàn)

          要實現(xiàn)添加功能也很簡單,根據(jù)我們的輸入,我們利用賬目類的構(gòu)造函數(shù)創(chuàng)建一個對象,然后將其加入總賬目列表當中就可以了。

          public?void?add(List<Bill>?billList,?int?id,?String?category,?String?account,?String?type,?double?amount,?String?time,?String?desc)?{
          ????//創(chuàng)建一個賬單對象,然后將其加入列表
          ????Bill?bill?=?new?Bill(id,?category,?account,?type,?amount,?time,?desc);
          ????billList.add(bill);
          }

          刪除賬目

          假如我們的賬目要公開給別人看,而自己有的賬目又不想讓別人看到,咋辦呢?很簡單!我們只需要將這筆賬目干掉即可!這里我們只要輸入我們所要刪除的賬單 ID,然后將其從總賬目列表中刪除即可。

          • 預覽
          72ebda79be78c91d2a044151819bbee5.webp
          • 代碼實現(xiàn)

          要刪除我們的賬目,只需要根據(jù)我們輸入的賬單 id,找到對應 id 的賬目,然后將其刪除即可,這里之所以沒有使用 remove(index) 的方式,是因為我們的 id 是自己輸入的,這其實是不規(guī)則的,如果我們使用 remove(index) 的方式,就有可能導致越界的問題。

          public?void?del(List<Bill>?billList,?int?id)?{
          ????//找到對應?id?的賬單,并將其刪除
          ????for?(Bill?bill?:?billList)?{
          ????????if?(bill.getId()?==?id)?{
          ????????????billList.remove(bill);
          ????????}
          ????}
          }

          修改賬目

          我們偷偷拿了私房錢買了猛男必備顯卡(RTX 3090)想趁空了打打游戲,遇到老婆查賬時,這時候可不能慌,我們只需要把賬單偷梁換柱,改換成其他東西就可以,而且此事神不知鬼不覺,美滋滋呀!

          • 預覽
          903c856ac616de900ce67dbcf618cefb.webp修改賬目
          • 代碼實現(xiàn)

          利用代碼實現(xiàn)也很簡單,找到對應 ID 的賬單,然后重新輸入賬單各個細節(jié)進行修改即可!

          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 個不同的功能,既可以查看所有賬單,也可以根據(jù)我們所輸入的時間區(qū)間進行篩選,最后,還能夠根據(jù)我們的輸入查詢出收入和支出的詳細情況。

          查詢所有賬目

          • 預覽
          c387a305f20fe26271bf4e098f3af021.webp所有賬目
          • 代碼實現(xiàn)

          查詢所有賬單很簡單,只需要遍歷我們總賬單列表即可。

          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());
          ????}
          }

          按時間區(qū)間查詢

          • 預覽
          26fa0665d259f60eac08667d8cca058f.webp
          • 代碼實現(xiàn)

          按照時間跨度來查詢稍微要麻煩一些,這里要處理兩個輸入,一個是開始時間,一個是結(jié)束時間,我們需要將賬單的時間和這兩個時間進行比較,篩選出介于這兩者之間的賬單。所以這里要涉及到 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?{
          ????????????//?將輸入的時間字符串轉(zhuǎn)換為格式化的?Date?類型
          ????????????Date?tmpDate?=?simpleDateFormat.parse(tmpTime);
          ????????????Date?startDate?=?simpleDateFormat.parse(startTime);
          ????????????Date?endDate?=?simpleDateFormat.parse(endTime);
          ????????????//?將介于開始時間和結(jié)束時間的賬單進行過濾
          ????????????if?(tmpDate.before(endDate)?&&?tmpDate.after(startDate))?{
          ????????????????return?true;
          ????????????}
          ????????}?catch?(ParseException?parseException)?{
          ????????????parseException.printStackTrace();
          ????????}
          ????????return?false;
          ????????//????將其轉(zhuǎn)換為列表
          ????}).collect(Collectors.toList());

          ????queryAll(bills);
          }

          按類型查詢

          • 預覽
          343e4b3cc85839a45b88af63732afbe4.webp
          • 代碼實現(xiàn)

          這里按類型查詢其實就是在查詢所有賬單的基礎(chǔ)上加上一個限制條件,只要其類型等于我們的輸入即可,這里我寫了兩種篩選的方法。一種是直接使用 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);
          }

          退出系統(tǒng)

          • 預覽
          be02932cca773f0a11f4b8fa3c06f801.webp退出系統(tǒng)
          • 代碼實現(xiàn)

          在主菜單中,我們已經(jīng)設(shè)置了一個標志位 flag,當 flagtrue 時,我們每完成一項功能則循環(huán)打印主菜單在控制臺中,而如果我們想要退出系統(tǒng),只需要將標志位 flag 設(shè)置為 false 即可,此時不滿足 while 循環(huán)的條件,所以跳出循環(huán),因此退出系統(tǒng)的關(guān)鍵在于標志位狀態(tài)的轉(zhuǎn)換。

          case?"0":
          ????flag?=?false;
          ????break;

          整體程序

          將各個子模塊功能實現(xiàn)之后,剩下的就是整合工作了,最后得到我們最后的總體程序結(jié)構(gòu)如下,主要代碼均位于 com.cunyu 包下,然后分別是:

          • 實體類 Bill
          • 接口類 IBill
          • 主程序 MainApp
          b42609ed4a219fe67c3b678bb63fc929.webp

          總結(jié)

          好了,以上就是我們簡單的記賬本的實現(xiàn)了。實現(xiàn)的功能比較簡陋,程序的健壯性也不夠強,還有很大的優(yōu)化空間。大家如果感興趣或者有優(yōu)化的地方,歡迎到本設(shè)計的 Github 倉庫地址:https://github.com/cunyu1943/java-in-actions 提交 issue。當然了,如果你只是需要用來簡單的做個示例,也可以自取。

          最后,如果本文對大家有用的話,希望給我一個 ? star,滿足一下我的虛榮心呀 ~ ??????

          - END -


          瀏覽 43
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美大香蕉久久 | 卡一卡二卡三高清无码在线观看 | 无码人妻精品一区二区蜜桃色 | 搡老熟女大熟了88AV一区二区 | 久久99嫩草99久久精品 |