java-BLOG-1

小瑞尔威發表於2024-10-26

1.前言
第一二個題目集除了最後一個題目以及第三個題目集的第一個題目都比較簡單,只要按照題目要求,建立相應的類,題目比較簡單一般只需要建立一個類和相應的一些屬性、方法,按照輸入輸出的要求進行建立就行。前兩個題目集只需要做對相應的輸出就能做對,而第三個題目集重點增加了對輸入的不合法的判斷,以及其對應輸出。比如:第三個題目集的第二個題目。有超過1個日期不合法和第一行日期非法、第二行日期合法且有效這兩個測試點,因為我用的是正規表示式,一開始就限定了範圍,而導致超出的範圍沒辦法判斷,所以一直通不過。後面改了正規表示式的範圍,才透過。對於這三個題目集的最後一個題目,難度大,需要建立多個類,輸入和輸出的格式和內容比較多,測試點多。

2.設計與分析
第一次題目集-答題判題程式-1
(1)類圖

由於第一次我還沒使用正規表示式,所以我使用的是String類裡的方法,但它有很多侷限性,必須要有固定格式而且操作繁瑣。在後面使用正規表示式,才發現正規表示式是真的方便。

input.hasNextLine() 是 Java 中 Scanner 類的一個方法,用於檢查輸入中是否還有下一行可供讀取。常用在讀取文字檔案或控制檯輸入時,通常與 input.nextLine() 方法一起使用,以確保在嘗試讀取下一行之前,輸入流中確實還有資料。

使用TreeMap有一些十分方便的方法可以輸出,不用自己格外寫函式。

第二次題目集-答題判題程式-2
(1)類圖

這個題目是在上次題目進階的,所以我上次使用的是陣列,發現陣列有侷限性,每次輸出時都要一個迴圈,而且要傳這個陣列的長度,並且要提前設定長度,這會導致有空餘。而用列表的話,它定義了很多好用的方法,不用自己再去定義函式了,省事了很多。

第三次題目集-答題判題程式-3
(1)類圖
由於這次實驗我沒有留出足夠的時間,導致我把所有功能寫在一個類裡,後面我把功能分成幾個類,並重新畫出類圖。所以這次就不多說了。

這次實驗終於使用了正規表示式,要根據輸入格式設定符合的格式。

輸入後要判斷是否符合表示式,如果符合就進行操作,由於要儲存資料,要用split來分隔資料,並進行儲存。

3.踩坑心得
(1)正規表示式的資料範圍
String regex = "^(([0-9]{4})-([0-9]{2})-(0[0-9]|[1-9][0-9]))$";
一開始正規表示式是月份和天數是固定在12和31以內的,但輸出格式是如果第一行日期字串非法,輸出自定義的錯誤資訊。所以導致輸入天數和月份超過31、12時,程式碼輸出沒反應,導致測試點沒過。
(2)計算兩日期之差

如果是自己寫個函式計算兩個日期之間的差,是比較複雜的,可以直接使用這個程式碼可以輕鬆的算出值,非常方便。
(3)檢查輸入中是否還有下一行可供讀取

如果沒有以end為結尾的要求,就需要判斷下一行是否有資料,可以考慮input.hasNextLine() 判斷下一行是否還有資料。
(4)將String型別準換成int型別
在處理String資料時常常遇到這樣的情況,要把其型別轉換成int型別,可以使用Integer.parseInt()轉換。

4.改進建議

5.總結
正規表示式確實方便,一開始我都不是使用正規表示式,用了之後我就發現它得定義得知識點有很多,所以還需要深入學習。類與類之間得資料傳輸感覺把握得不是很好,常常報錯,還有就是類之間經常重複定義,明明這幾個類的作用是一樣的,可以用一個資料直接傳,而不用傳多次。同時類的定義和方法還需斟酌,定義幾個類,其屬性和方法是什麼,這是關鍵,也是最難的,需要終身學習。有時我發現使用了一鐘模式,我會依賴它,然後遇到問題時又會使用它來解決,可又是卻又不是最佳方法,可能還更繁瑣,所以需要嘗試不同的方法,瞭解其好壞和適用場景。
這幾次實驗我都沒有拿滿分,其中一個主要原因是我預留的時間不充足,所以下次實驗開始我會預留足夠的時間去寫。