PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   七嘴八舌異言堂 (https://www.pcdvd.com.tw/forumdisplay.php?f=12)
-   -   板上的Java高手請教,勞工新制的工時計算 (https://www.pcdvd.com.tw/showthread.php?t=1119247)

mor8 2016-12-25 10:26 PM

板上的Java高手請教,勞工新制的工時計算
 
假設某月份,31天,每天的工時,如下面的陣列,
6.5表示當天上班6.5小時,0表示當天休假。
{6.5,9,6.5,9.5,6.5,6.5,0,6.5,6.5,6.5,6,9.5,6.5,0,6.5,9,6.5,6,6.5,0,6.5,6.5,6.5,6.5,6.5,6.5,0,6.5,0,0,0}

條件:
一、7休1
二、14休2
三、7天內的工時合計不可超過48小時
四、14天內的工時合計不可超過80小時,若超過時顯示加班幾個小時

請問Java要怎麼寫,才能檢查上面的陣列是否符合,若不符合,請顯示哪天到哪天不符合,感謝!!!

vxr 2016-12-25 11:04 PM

如果是我, 會考慮OOD來降低複雜度...
在我看來你提供的條件都是策略..
應該用STRATEGY來拆開算法(先不去管要不要合併TEMPLATE METHOD, 我沒有注意到有特別的流程)...
連續檢查的情況下可以做成一條chain...
可以把職責做成Responsibility of chain連續傳遞...
我不希望充斥著一大堆的if/else或著switch, ugly code. terrible...
免不了一定會有factory的設計來操作...
也許思考上我可能還有些缺失...

當然, 可以裝B應用結構化程序方式慢慢折騰...

mor8 2016-12-25 11:16 PM

引用:
作者vxr
如果是我, 會考慮OOD來降低複雜度...
在我看來你提供的條件都是策略..
應該用STRATEGY來拆開算法(先不去管要不要合併TEMPLATE METHOD, 我沒有注意到有特別的流程)...
連續檢查的情況下可以做成一條chain...
可以把職責做成Responsibility of chain連續傳遞...
我不希望充斥著一大堆的if/else或著switch, ugly code. terrible...
免不了一定會有factory的設計來操作...
也許思考上我可能還有些缺失...

當然, 可以裝B應用結構化程序方式慢慢折騰...

你說的那些,我只會用if/else來處理,其他的我都不懂。
我是想說,先檢查條件1(7休1),若不符合,就顯示哪裡不符合。
然後再檢查條件2,以此類推。
我大概只會最簡單的方式。

vxr 2016-12-25 11:21 PM

引用:
作者mor8
你說的那些,我只會用if/else來處理,其他的我都不懂。
我是想說,先檢查條件1(7休1),若不符合,就顯示哪裡不符合。
然後再檢查條件2,以此類推。
我大概只會最簡單的方式。

這個結構化程序的設計顯然缺失就是大量的條件判斷...
如果對OOAD很生疏, 結構化程序設計不是不行...
只是我覺得代碼會變得相當複雜....
你是否有接觸過一些OO的基本原則??..
比方說有一個叫 "駱駝特馬的" 這個王八創造了SOLID-5大原則...

雖然像是駱駝特馬的或著馬的發拉(這個傢伙特別混帳...:mad:..)等等, 這些王八專家總是創造一大堆新名詞來稿死人...

mor8 2016-12-25 11:47 PM

引用:
作者vxr
這個結構化程序的設計顯然缺失就是大量的條件判斷...
如果對OOAD很生疏, 結構化程序設計不是不行...
只是我覺得代碼會變得相當複雜....
你是否有接觸過一些OO的基本原則??..
比方說有一個叫 "駱駝特馬的" 這個王八創造了SOLID-5大原則...

雖然像是駱駝特馬的或著馬的發拉(這個傢伙特別混帳...:mad:..)等等, 這些王八專家總是創造一大堆新名詞來稿死人...

那能否教我條件1的7休1,用IF的方式,剩下我自己慢慢摸索,謝謝!

whatsnew 2016-12-26 12:22 AM

以1來說笨蛋一點不就對數列做index
直接loop 31(n=1:31)次,或是根據數列長度做變化
每次loop (0+n)~(6+n),取出相對應的數列
再對這7個數字尋找0出現次數
0次的話就輸出date(n)~date(6+n) 相對應的日期
我應該沒誤會樓主的意思吧@@

darkangel 2016-12-26 01:07 AM

我覺得先針對要解決的問題寫 code,比為了 DP 而 DP 好。
樓主現在問題的重點是算法,不是設計。

我覺得這種小東西用到 strategy 就已經是在用牛刀殺雞了,再加 factory 感覺就像拿電鋸了,如果你有一兩百隻雞要殺,這是不錯的選擇。

可是我覺得樓主不過就只想殺一隻雞而已...

:laugh: :laugh: :laugh: :laugh: :laugh:

classspeed 2016-12-26 01:07 AM

int flag = 1;
for(int i = 0; i < 30; i++, flag++){
 if(array[n] == 0){
  flag = 0;
 }
 if(flag > 6){
 System.out.println("第" + (n+1) + "天不符合");
 }
}

vxr 2016-12-26 01:22 AM

引用:
作者mor8
那能否教我條件1的7休1,用IF的方式,剩下我自己慢慢摸索,謝謝!

如果條件一的問題..
我的想法是這樣...
我猜你的問題是抽出來看是否符合7休一天的條件...
假設你休的日子是固定的
比方說修星期日=7..
迴圈用餘數去算然後抽出來檢查..
但是我覺得這方法不好..
因為迴圈次數大...
可以的話用倍數去算...
迴圈次數將會大幅減少...
否則你要慢慢loop到31次嗎?...

我不清楚你對Java的熟悉程度, 你可以建立一個class..
然後宣告一個公開的委派...
因為委派是方法的pointer, 還可以形成chain.....
然後在裡面填入相關的算法...
再來....!@#$%^&*(
好吧! darkangel老兄說的...
用牛刀殺雞, forget it!!!....

darkangel 2016-12-26 02:10 AM

引用:
作者vxr
如果條件一的問題..
因為迴圈次數大...
可以的話用倍數去算...
迴圈次數將會大幅減少...
否則你要慢慢loop到31次嗎?...



一般 i++ loop 的時間複雜度是 O(n),而像這種迴圈最大值很小(<100)的狀況下通常會比用倍數迴圈的 O(log n) 快。

另外,不應該在這裡考慮效能問題,瓶頸不太可能會出現在這。

以我n年的實務經驗,我覺得設計時有兩個重點,分享一下:

1. 不要過度設計
2. 不要在設計時考慮效能問題,不然容易失去重點

我不熟 java,不然我給的答案應該也是 loop + if/else。


所有的時間均為GMT +8。 現在的時間是06:18 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2025。