2017-06-30 27 views
1

我是java編程的新手,我需要幫助從數組列表中每週(每週第一天[星期一])過濾我的記錄本年度。[java] [日曆] - 從Arraylist過濾我的記錄<Bean> Weekly

我有一個簡單的表,結果顯示我的所有記錄從一個ArrayList:

+----+-------+-----------+-------+-------------------+ 
| ID | Name | LastName | Email | Registration Date | 
+----+-------+-----------+-------+-------------------+ 
| 1 | Name1 | LastName1 | Email | 01-01-2017  | 
+----+-------+-----------+-------+-------------------+ 
| 2 | Name2 | LastName2 | Email | 05-02-2017  | 
+----+-------+-----------+-------+-------------------+ 
| 3 | Name3 | LastName3 | Email | 15-02-2017  | 
+----+-------+-----------+-------+-------------------+ 
| 4 | Name4 | LastName4 | Email | 18-03-2017  | 
+----+-------+-----------+-------+-------------------+ 
| 5 | Name5 | LastName5 | Email | 22-04-2017  | 
+----+-------+-----------+-------+-------------------+ 
| 6 | Name6 | LastName6 | Email | 15-05-2017  | 
+----+-------+-----------+-------+-------------------+ 
| 7 | Name7 | LastName7 | Email | 26-06-2017  | 
+----+-------+-----------+-------+-------------------+ 
| 8 | Name8 | LastName8 | Email | 26-06-2017  | 
+----+-------+-----------+-------+-------------------+ 

的結果,我需要使用類似的過濾器註冊時間過濾我所有的每週記錄,以顯示:

+--------------------+ 
|Week from 02-01-2017| 
+----+-------+-------+---+-------+-------------------+ 
| ID | Name | LastName | Email | Registration Date | 
+----+-------+-----------+-------+-------------------+ 
| 1 | Name1 | LastName1 | Email | 02-01-2017  | 
+----+-------+-----------+-------+-------------------+ 
| 2 | Name2 | LastName2 | Email | 05-01-2017  | 
+----+-------+-----------+-------+-------------------+ 

+--------------------+ 
|Week from 13-02-2017| 
+----+-------+-------+---+-------+-------------------+ 
| ID | Name | LastName | Email | Registration Date | 
+----+-------+-----------+-------+-------------------+ 
| 3 | Name3 | LastName3 | Email | 15-02-2017  | 
+----+-------+-----------+-------+-------------------+ 

+--------------------+ 
|Week from 13-03-2017| 
+----+-------+-------+---+-------+-------------------+ 
| 4 | Name4 | LastName4 | Email | 18-03-2017  | 
+----+-------+-----------+-------+-------------------+ 

+--------------------+ 
|Week from 17-03-2017| 
+----+-------+-------+---+-------+-------------------+ 
| 5 | Name5 | LastName5 | Email | 22-04-2017  | 
+----+-------+-----------+-------+-------------------+ 

+--------------------+ 
|Week from 15-05-2017| 
+----+-------+-------+---+-------+-------------------+ 
| 6 | Name6 | LastName6 | Email | 15-05-2017  | 
+----+-------+-----------+-------+-------------------+ 
| 7 | Name6 | LastName6 | Email | 19-05-2017  | 
+----+-------+-----------+-------+-------------------+ 

+--------------------+ 
|Week from 26-06-2017| 
+----+-------+-------+---+-------+-------------------+ 
| 8 | Name7 | LastName7 | Email | 26-06-2017  | 
+----+-------+-----------+-------+-------------------+ 
| 9 | Name8 | LastName8 | Email | 29-06-2017  | 
+----+-------+-----------+-------+-------------------+ 

「從dd-MM-yyyy開始的周」中的日期表示當我的程序執行的當年的所有星期一可以在2026年執行並且每週過濾記錄。

這是我開發的代碼:

//from an Arraylist instantiated: 
List<CertificatMajCrBean> lines = new ArrayList<CertificatMajCrBean>(); 

與我想補充的元素:

lines.add(records); 

//我顯示結果那樣:

System.out.println("+---------+----------------+---------------------+------------------+-------------------+"); 
System.out.println("| ID  | Name   | LastName  | Email   | Registration Date  |"); 
System.out.println("+---------+----------------+---------------------+------------------+-------------------+"); 
for (CertificatMajCrBean line: lignes){ 

System.out.println("| "+numRec+" | "+line.getName()+" | "+line.getLastName()+" | "+line.getEmail() +" | "+line.getRegistrationDate()+" |"); 
System.out.println("+---------+----------------+---------------------+------------------+---------------------------+"); 
numRec ++; 

} 

成這個迭代我想添加我的過濾器。

任何幫助使這個算法真實,非常感謝!

+4

你的問題很有意義。您應該向我們展示您的努力,或者至少告訴我們您的搜索和研究未能解決您的任務。這會給我們一個更好的起點來指導你。 –

+2

你的標籤打擾了我一下,至少其中一個。作爲一名新的Java程序員,您不應該學習或使用'SimpleDateFormat'。這已經過時了。將您的日期表示爲'LocalDate'。如果您需要格式化或解析,請使用「DateTimeFormatter」。 –

+0

輸入中不存在預期輸出中的幾個日期值(例如'19-05-2017')。請編輯它以避免混淆。接下來,在第一個預期產出中,「02-01-2017」和「05-02-2017」不屬於同一周。 – putu

回答

1

我認爲,在良好的作風和斷裂問題成小塊的名字第一次我們單獨從你的結果的計算打印它。爲此,我們需要一個數據結構,可以保存大量的bean列表,每週一個列表。我建議:

Map<LocalDate, List<CertificatMajCrBean>> byWeek = new TreeMap<>(); 

大多數情況下人們會使用HashMap而不是TreeMap。你可以,但是TreeMap的好處是它可以保持地圖按日期排序,當我們想按時間順序打印每週列表時,這將有助於我們。

爲了計算,按照您可能已經在做的方式遍歷您的ArrayList。對於列表中的每個CertificatMajCrBean,獲取註冊日期。我認爲這是一個LocalDate,正如我在評論中所建議的那樣。從bean.getRegistrationDate().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY))查找一週開始的星期一。我知道它看起來很複雜,但它很可愛。按照方法名稱的建議,如果已經是星期一,它會找到註冊日期的前一個星期一或同一日期。接下來,檢查這個星期一是否已經是地圖上的關鍵字。這是使用byWeek.get(mondayOfRegWeek)最簡單的方法。這將首次返回null,因爲還沒有地圖條目。在這種情況下,創建一個新的ArrayList,將您的bean存儲到其中並將其放入地圖中:byWeek.put(mondayOfRegWeek, weeklyBeans);其中weeklyBeans是您新創建的列表。如果byWeek.get(mondayOfRegWeek)返回一個列表,只需將它添加到它,你就完成了。從列表中處理完所有bean後,地圖就完成了。

用於打印結果使用for環比條目集地圖:

for (Map.Entry<LocalDate, List<CertificatMajCrBean>> entry : byWeek.entrySet()) { 
     // print beans from one week here 
    } 

裏面的for循環使用entry.getKey()拿到週一的一週開始的地方。如果你只是打印日期,它會出現爲2017-06-26。要以其他方式格式化,您可以使用DateTimeFormatter。要獲得本週的豆類列表,請使用entry.getValue()。你也可以在循環中使用循環來打印每個bean。

如果其中一些要求澄清,您可能需要先檢查the API documentation,否則請在此處回覆評論。

如果您已經進階,我會告訴您使用StreamCollectors.groupingBy()進行計算。如果你是編程新手,你可能不想嘗試。

+0

非常感謝我編輯了我的問題的主體,以添加如何打印我的記錄從我的ArrayList ,將嘗試發展你的建議接縫複雜,但會做! – AlexAlba

+1

事情是我使用Java 7,無法導入LocaleDate,我該怎麼辦? @Ole V.V. – AlexAlba

+0

我只有java.util中的區域設置 – AlexAlba