PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 其他群組 > 七嘴八舌異言堂
帳戶
密碼
 

  回應
 
主題工具
vxr
Elite Member
 
vxr的大頭照
 

加入日期: May 2002
您的住址: 地球的上面..
文章: 5,854
Exclamation

如果是.NET的情況下..
因為java這幾年落後.NET有點不少..
(我朋友說都是那個ORACLE......)...
我不曉得java能不能做到類似..
(第八版也許可以)

.NET的使用者可以透過LINQ..
雖然殺雞用牛刀, 可以PLINQ...
因為.NET很早發展lambda運算式和expression支持..
透過這些features可以更快速的達成要求...
     
      
舊 2016-12-26, 09:43 AM #21
回應時引用此文章
vxr離線中  
bibibirdie
Silent Member
 
bibibirdie的大頭照
 

加入日期: Mar 2012
文章: 0
不過如果每個月都重新將工作日回復成第一天的話,
會不會有月尾接月初而沒有7休1的漏洞?
純粹好奇而已。
 
舊 2016-12-26, 10:25 AM #22
回應時引用此文章
bibibirdie離線中  
vxr
Elite Member
 
vxr的大頭照
 

加入日期: May 2002
您的住址: 地球的上面..
文章: 5,854
Exclamation

引用:
作者mor8
謝謝您!
您的方法對我而言,真的是太難了。

原本沒有打算寫, 只是想嘴砲而已....
不過還是coding一次給你參考一下:
int holidays = 0;
double?[] d = { 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 };
int len = d.Length + 4;
int unit = 7;
int start = 0;
int loop = 0;
Console.WriteLine("總計天數: {0}", d.Length);
while (start < len)
{
start += unit;
for (int j = start - unit; j < start && j < d.Length; j++)
{
if (d[j] == 0)
{
holidays++;
Console.WriteLine("第{0}天為假日", j + 1);
break;
} // end if
loop++;
} // for
} // end for
Console.WriteLine("七休一計算值: {0}", holidays);
Console.WriteLine("迴圈記數值: {0}", loop);

holiday就相當於一個參數保留..
可以拿他用來計算第二個條件...
如果OOP還可以, 你可以設計一次類, 放置一些所需的屬性
在過程中來存放以利後面三個條件快速計算操作的參數值...

此文章於 2016-12-26 10:38 AM 被 vxr 編輯.
舊 2016-12-26, 10:34 AM #23
回應時引用此文章
vxr離線中  
JXL
*停權中*
 

加入日期: Oct 2012
您的住址: 晚上黑壓壓一片的那區
文章: 99
引用:
作者bibibirdie
不過如果每個月都重新將工作日回復成第一天的話,
會不會有月尾接月初而沒有7休1的漏洞?
純粹好奇而已。



一個月的最後七天休第一天
下個月的第一個七天休最後一天
中間不就超過七天了
舊 2016-12-26, 10:35 AM #24
回應時引用此文章
JXL離線中  
Jason Ju
Regular Member
 

加入日期: Mar 2000
您的住址: Taiwan
文章: 78
代碼:
public void count(final double[] dayHoursArry){
	for(int i = 0; i < dayHoursArry.length; i ++){
		final int startDate = i;
		//三、7天內的工時合計不可超過48小時
		final int weekEndDate = i+6; 
		final double[] newArry7days = Arrays.copyOfRange(dayHoursArry, startDate, weekEndDate);
		final double weekdayHours = getSum(newArry7days);
		System.out.println("day " + startDate + " to day " + weekEndDate + " hours = " + weekdayHours);
		chekcOffDays(newArry7days);
		if(weekdayHours > 48) {
			System.out.println(" ==> over " + (weekdayHours-48) );
		}
		//四、14天內的工時合計不可超過80小時,若超過時顯示加班幾個小時
		final int twoWeekEndDate = i+13;
		final double[] newArry14days = Arrays.copyOfRange(dayHoursArry, startDate, twoWeekEndDate);
		final double twoWeekdayHours = getSum(newArry14days);
		System.out.println("day " + startDate + " to day " + twoWeekEndDate + " hours = " + twoWeekdayHours);
		chekcOffDays(newArry14days);
		if(twoWeekdayHours > 80){ 
			System.out.println(" ==> over " + (twoWeekdayHours-80) );
		}
	}
}

public double getSum(final double[] arry){
	double sum = 0;
	for(double d: arry) sum +=d; 
	return sum;
}


public static void chekcOffDays(final double[] array) { 
	//一、7休1
	if(array.length == 7 && !Arrays.asList(array).contains(0))
		System.out.println("7天未休1 ");			
	//二、14休2
	if(array.length == 14){
		if(Arrays.asList(array).contains(0)){
			Set dupes = new HashSet(); 
			for (double d : array) {
				if(d == 0 && !dupes.add(d))
					break;
				System.out.println("14天僅休1 ");		
			} 
		}else {
			System.out.println("14天未休2 ");	
		}
	} 
}
舊 2016-12-26, 10:55 AM #25
回應時引用此文章
Jason Ju離線中  
substar999
Senior Member
 

加入日期: Sep 2001
您的住址: K
文章: 1,498
個人小意見,以下四個條件不能只看當月吧,
要從新制實施日或員工到職日當天開始勾稽,
所以要是我會在每天工時之外另加flag判斷,
以確定當天工時是否被勾稽過,
然後程式就每天至少跑一次更新狀況即可。
至於怎麼判斷...if處理就好,一天一次,
就算幾萬人也不會花上太多時間。

引用:
作者mor8
假設某月份,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要怎麼寫,才能檢查上面的陣列是否符合,若不符合,請顯示哪天到哪天不符合,感謝!!!
舊 2016-12-26, 11:00 AM #26
回應時引用此文章
substar999離線中  
vxr
Elite Member
 
vxr的大頭照
 

加入日期: May 2002
您的住址: 地球的上面..
文章: 5,854
Exclamation

引用:
作者vxr
原本沒有打算寫, 只是想嘴砲而已....
不過還是coding一次給你參考一下:
int holidays = 0;
double?[] d = { 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 };
int len = d.Length + 4;
int unit = 7;
int start = 0;
int loop = 0;
Console.WriteLine("總計天數: {0}", d.Length);
while (start < len)
{
start += unit;
for (int j = start - unit; j < start && j < d.Length; j++)
{
if (d[j] == 0)
{
holidays++;
...

sorry..
我想了一下..
inner loop的j值倒著算會更好...

此文章於 2016-12-26 11:08 AM 被 vxr 編輯.
舊 2016-12-26, 11:06 AM #27
回應時引用此文章
vxr離線中  
Adsmt
Golden Member
 
Adsmt的大頭照
 

加入日期: Feb 2004
您的住址: 從來處來
文章: 2,762
引用:
作者vxr
那我建議你以一個星期(7天)為一個單位..
作為第一層loop
而且以倍數性增長
7, 14, 21, 28這樣..
然後放入一個inner loop...
1-7
8-14
15-21
依此類推
只要抽出檢查發現有一天有假日就符合用break跳出inner loop...
不要乖乖真的跑loop到31次..
那不是一個好作法..
最簡單的理由就是有可能每一次的inner loop都跑完嗎?...
如果每次都跑完, 這甚麼鳥公司啊...
這出勤已經不是可以用血汗來形容了.......
違反勞基法, 要向勞檢單位檢舉......
你要適切的符合真實世界情況...

好吧!.. 有人會覺得我機車...
小弟就是不想跑完那31次loop拉..>o<""

當你掌握了這樣的算法..
你再增加一個類似event_args之類的物件, 目的類似context..
要用他做紀錄..
為的就是要快速計算你後面的三個條件...

沒看你的程式,但看你的描述,如果是

0 8 8 8 8 8 8 8 8 8 8 8 8 0 這樣工作及假日分配,是否你的程式會判為「符合七休一」?但實際上這樣違反七休一了。
舊 2016-12-26, 11:20 AM #28
回應時引用此文章
Adsmt離線中  
Jason Ju
Regular Member
 

加入日期: Mar 2000
您的住址: Taiwan
文章: 78
基本上我不會預設哪天休假日, 只要去檢查每個 7 天及 14 天 range 有無抵觸均可. 這樣的案例, 效能跟要套用的 pattern 一定不會是優先考量, 架構隨 biz rule 撰寫, 好理解好維護還更重要.
舊 2016-12-26, 11:25 AM #29
回應時引用此文章
Jason Ju離線中  
vxr
Elite Member
 
vxr的大頭照
 

加入日期: May 2002
您的住址: 地球的上面..
文章: 5,854
Exclamation

引用:
作者Adsmt
沒看你的程式,但看你的描述,如果是

0 8 8 8 8 8 8 8 8 8 8 8 8 0 這樣工作及假日分配,是否你的程式會判為「符合七休一」?但實際上這樣違反七休一了。

以七天為一個單位...
第一個禮拜: 0 8 8 8 8 8 8
第二個禮拜: 8 8 8 8 8 8 0
這樣違反七休一?......

小弟只是依照樓主的條件計算..
舊 2016-12-26, 11:28 AM #30
回應時引用此文章
vxr離線中  


    回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



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


vBulletin Version 3.0.1
powered_by_vbulletin 2025。