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-26 01:45 PM

引用:
作者傳說
一、沒import相關的package?
NetBean:按Alt+Shift+F
Eclipse:按Ctrl+Shift+O
不同版本可能有不同的組合鍵!

二、你要問自己那個資料陣列怎麼來的!


謝謝您的回答。

一、我把Jason Ju網友的程式碼放到eclipse中,如下,錯誤不少,不知該如何解決。
方便的話,可以給我全部的程式碼嗎?感恩! :)
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;


public class day3 {

public static void main(String[] args) {
// TODO Auto-generated method stub
double[] dayHoursArry = { 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 };

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 ");
}
}
}

}

}


二、要從資料庫去讀取,還在研究中。 :)

Jason Ju 2016-12-26 01:52 PM

引用:
作者mor8
謝謝您的回答。

一、我把Jason Ju網友的程式碼放到eclipse中,如下,錯誤不少,不知該如何解決。
方便的話,可以給我全部的程式碼嗎?感恩! :)
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;


public class day3 {

public static void main(String[] args) {
// TODO Auto-generated method stub
...


其實這是一個很簡單而且有助於訓練邏輯性的程式.
不過我看你應該是完全不會 java language 吧? 建議要從基本開始.

代碼:
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

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

public class WorkingDayUtil {
	
	public WorkingDayUtil(){
	}
	
	/**
	 * counting
	 * @param dayHoursArry
	 */
	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) );
			}
		}
	}
	
	/**
	 * get summary from all elements in array
	 * @param arry
	 * @return
	 */
	public double getSum(final double[] arry){
		
		double sum = 0;
		for(double d: arry) sum +=d; 
		return sum;
	}
	
	/**
	 * check the off days in day range
	 * @param array
	 */
	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 ");	
			}
		} 
	}

	/********************** test **********************/
	public static void main(String[] args){
		/*
		 * {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}
		 */
		final double[] dayHoursArry = 
			{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};
		WorkingDayUtil wdu = new WorkingDayUtil();
		wdu.count(dayHoursArry);
	}
	
}


傳說 2016-12-26 02:03 PM

建議你先把classspeed的程式看懂吧!
如果一直看不懂
你還是換工作吧!

引用:
作者mor8
謝謝您的回答。

一、我把Jason Ju網友的程式碼放到eclipse中,如下,錯誤不少,不知該如何解決。
方便的話,可以給我全部的程式碼嗎?感恩! :)

mor8 2016-12-26 02:11 PM

引用:
作者Jason Ju
其實這是一個很簡單而且有助於訓練邏輯性的程式.
不過我看你應該是完全不會 java language 吧? 建議要從基本開始.


import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

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

public class WorkingDayUtil {

public WorkingDayUtil(){
}

/**
* counting
* @param dayHoursArry
*/
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, weekEndDa...

初學者,請多多包涵。
感恩! :)

mor8 2016-12-26 02:14 PM

引用:
作者傳說
建議你先把classspeed的程式看懂吧!
如果一直看不懂
你還是換工作吧!

classspeed網友的程式碼,
我已經看懂了。 :like:

vxr 2016-12-26 03:24 PM

沒注意到連續天數的問題...
重構之後...
還是變成整個loop最快...Orz
這個答案跟classspeed網兄是一樣的...
C# code:
double?[] d = { 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, 8, 8, 0, 0 };
int limit = 7, keep = 0;
Console.WriteLine("總計天數: {0}\n\r", d.Length);
for (int i = 0; i < d.Length; i++)
{
if (d[i] != 0)
keep++;
else
{
if (keep >= limit)
{
Console.WriteLine("連續工作{0}天, 已達{1}天限制({2}日至{3}日)", keep, limit, i - keep + 1, i);
// do something
//
if (d.Length - (i + 1) < limit)
break;
// end if
} // end if
keep = 0;
} // end if
} // end for

tbsky 2016-12-26 06:34 PM

引用:
作者classspeed
其實是蠻喜歡討論這個的,
早上睡醒還跟老婆分享這件事,
結果被她抓到 i 變 n 跟 i < 30 的問題XD
說我沒有驗證就回XD


怎麼感覺寫程式寫著寫著突然變成放閃了啊..

micall.lee 2016-12-26 08:20 PM

以下是開玩笑啦 ...

為什麼我有一種要替別的公司解決人事系統問題的感覺 :laugh: :laugh:


所有的時間均為GMT +8。 現在的時間是01:17 PM.

vBulletin Version 3.0.1
powered_by_vbulletin 2025。