java程式之出差補助計算
某公司為其它公司做技術服務,人員按照客戶要求出差外派。補貼是在人員出差前預先派發的。需要計算出每個人的補貼數值,並且需要派出日期先後排序,以便於安排進行統一借款並進行補貼的派發。如果派出日期相同,則按照補貼金額從少到多排序。
按照出差時間長短,補貼的標準是不同的。具體規定是:
30天以內,每日補貼50元;超出31而在60天以內部分,每日補貼多10元,即60元;超出61而在90天以內部分,每日補貼再多0即70元,……以30日為週期以此類推。
出差的天數以自然日計算,不需要考慮節假日。
舉例說明:
張三2010-9-16外派出差,到2010-9-30回到公司,計算出差時間為15天,因為少於30天,出差補貼為50*15=750元。
李四2010-9-1外派出差,到2010-10-20回到公司,計算出差時間為50天,50*30+60*20=2700元。
為了方便後期調整出差補貼標準,需要採用config.properties對上面的補貼標準進行配置,程式執行時從C:\test\下讀取。
配置檔案的內容為:
base=50
step=10
給出的輸入檔案為C:\test\src.txt,每行內容為3部分,姓名 派出日期 釋放日期
其中:每個欄位中間以一個空格分隔,日期的形式為2010-9-17。
結果請寫入C:\test\result.txt中,每行內容為5部分:姓名 派出日期 釋放日期 出差天數 補助金額。
其中:每個欄位中間以一個空格分隔,日期的形式為2010-9-17(注:月份或日期位數不滿2位的,不需要以0補全2位,即2010-9-1不需要輸出為2010-09-01);出差天數、金額保留到整數位。
輸入、輸出檔案編碼方式都使用GBK。
提示:程式設計過程中,可以使用apache commons包中的api (這個建議與考查的內容無關,至少便於對處理檔案關閉進行處理,評分是不會有任何影響)
除以上包以外,請使用j2se5.0或6.0的標準內容。引入其他第3方庫並不符合考試要求。
src.txt檔案的內容:
張三 2010-9-17 2010-10-15
李四 2010-9-5 2010-10-30
王五 2010-9-20 2010-11-2
趙六 2010-10-2 2010-10-30
阿童木 2010-10-15 2010-12-31
result.txt檔案的內容:
李四 2010-9-5 2010-10-30 56 3060
張三 2010-9-17 2010-10-15 29 1450
王五 2010-9-20 2010-11-2 44 2340
趙六 2010-10-2 2010-10-30 29 1450
阿童木 2010-10-15 2010-12-31 78 4560
config.properties檔案的內容:
base=50
step=10
package com.neusoft.exam;
import java.io.File;
import java.util.Collections;
import java.util.List;
/**
*
* <b>Application name:</b>exam<br>
* <b>Application describing:</b>主程式類<br>
*/
public class ExamMain
{
/**
*
* {主函式}
*
*/
public static void main(String[] args)
{
String srcFilePath = "c:" + File.separator + "test" + File.separator + "src.txt";
String dstFilePath = "c:" + File.separator + "test" + File.separator + "result.txt";
List<PeopleOut> list = FileOperation.readFile(srcFilePath);
Collections.sort(list);
FileOperation.writeFile(list, dstFilePath);
}
}
package com.neusoft.exam;
import java.io.File;
import java.math.BigDecimal;
import java.util.Calendar;
/**
*
* <b>Application name:</b>Exam<br>
* <b>Application describing:</b> 外派員工資訊類<br>
*/
public class PeopleOut implements Comparable<PeopleOut>
{
private String name;//姓名
private Calendar startDate;//外派開始日期
private Calendar endDate;//外派結束日期
private int days;//外派的天數
private BigDecimal buTie;//外出的補貼
/**
* {無參建構函式}
*
*/
public PeopleOut()
{
super();
// TODO Auto-generated constructor stub
this.days = 0;
this.buTie = new BigDecimal("0");
}
/**
* {帶3個引數的建構函式}
*
* @param name
* @param startDate
* @param endDate
*/
public PeopleOut(String name, Calendar startDate, Calendar endDate)
{
super();
this.name = name;
this.startDate = startDate;
this.endDate = endDate;
this.days = 0;
this.buTie = new BigDecimal("0");
this.countBuTie();//呼叫自己的計算補貼的方法給days和buTie賦值
}
/**
*
* {排序方法}
* 需要派出日期先後排序,
如果派出日期相同,則按照補貼金額從少到多排序。
* @param o
* @return
* @author:developer
*/
public int compareTo(PeopleOut o)
{
// if (this.startDate == o.getStartDate())
if (this.getStartDate().compareTo(o.getStartDate()) == 0)
{
//return o.getBuTie().compareTo(this.getBuTie());
return this.buTie.compareTo(o.getBuTie());
}
else
{
return this.startDate.compareTo(o.getStartDate());
}
}
/**
*
* {按照外派的天數計算每個人的補貼}
* 按照出差時間長短,補貼的標準是不同的。具體規定是:
30天以內,每日補貼50元;超出31而在60天以內部分,每日補貼多10元,即60元;
超出61而在90天以內部分,每日補貼再多0即70元,……以30日為週期以此類推。
*
*/
public void countBuTie()
{
this.days = DateOperation.daysBetween(startDate, endDate);
String filePath = "c:" + File.separator + "test" + File.separator + "config.properties";
BigDecimal base = new BigDecimal(PropertyOperation.readProperty(filePath).getProperty("base"));
BigDecimal step = new BigDecimal(PropertyOperation.readProperty(filePath).getProperty("step"));
int m = days / 30;
int n = days % 30;
for (int i = 0; i <= m; i++)
{
if (i == m)
{
buTie = buTie.add(base.add(new BigDecimal(i).multiply(step)).multiply(new BigDecimal(n)));
}
else
{
buTie = buTie.add(base.add(new BigDecimal(i).multiply(step)).multiply(new BigDecimal("30")));
}
}
this.buTie = buTie.setScale(0, BigDecimal.ROUND_HALF_UP);
}
/**
* buTie的GET方法
* @return BigDecimal buTie.
*/
public BigDecimal getBuTie()
{
return buTie;
}
/**
* days的GET方法
* @return int days.
*/
public int getDays()
{
return days;
}
/**
* endDate的GET方法
* @return Calendar endDate.
*/
public Calendar getEndDate()
{
return endDate;
}
/**
* name的GET方法
* @return String name.
*/
public String getName()
{
return name;
}
/**
* startDate的GET方法
* @return Calendar startDate.
*/
public Calendar getStartDate()
{
return startDate;
}
/**
* buTie的SET方法
* @param buTie The buTie to set.
*/
public void setBuTie(BigDecimal buTie)
{
this.buTie = buTie;
}
/**
* days的SET方法
* @param days The days to set.
*/
public void setDays(int days)
{
this.days = days;
}
/**
* endDate的SET方法
* @param endDate The endDate to set.
*/
public void setEndDate(Calendar endDate)
{
this.endDate = endDate;
}
/**
* name的SET方法
* @param name The name to set.
*/
public void setName(String name)
{
this.name = name;
}
/**
* startDate的SET方法
* @param startDate The startDate to set.
*/
public void setStartDate(Calendar startDate)
{
this.startDate = startDate;
}
/**
*
* {重寫toString()方法,便於輸出}
*
* @return
* @author:developer
*/
public String toString()
{
StringBuilder sb = new StringBuilder(80);
sb.append(name);
sb.append(" ");
sb.append(DateOperation.dateToStr(startDate));
sb.append(" ");
sb.append(DateOperation.dateToStr(endDate));
sb.append(" ");
sb.append(days);
sb.append(" ");
sb.append(buTie);
return sb.toString();
}
}
package com.neusoft.exam;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
*
* <b>Application name:</b>Exam<br>
* <b>Application describing:</b> 檔案操作類<br>
*/
public class FileOperation
{
/**
*
* {寫入檔案操作}
*
* @param list
* @param filePath
*/
public static void writeFile(List<PeopleOut> list, String filePath)
{
BufferedWriter bw = null;
try
{
bw = new BufferedWriter(new FileWriter(filePath));
for (PeopleOut p : list)
{
bw.write(p.toString());//向檔案中寫入一條資料
bw.newLine();//換行
}
bw.flush();//強制輸出緩衝區的內容,避免資料快取,造成檔案寫入不完整的情況。
}
catch (IOException e)
{
System.out.println("檔案寫入失敗!");
e.printStackTrace();
}
finally
{
if (bw != null)
{
try
{
bw.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
*
* {讀取檔案資訊操作}
*
* @param filePath
* @return
*/
public static List<PeopleOut> readFile(String filePath)
{
BufferedReader br = null;
List<PeopleOut> list = new ArrayList<PeopleOut>();
try
{
br = new BufferedReader(new FileReader(filePath));
String str = null;
String[] params = null;
PeopleOut p = null;
while ((str = br.readLine()) != null)
{
params = str.split(" ");
p = new PeopleOut();
for (int i = 0; i < params.length; i++)
{
if (i == 0)
{
p.setName(params[i]);
}
if (i == 1)
{
p.setStartDate(DateOperation.strToDate(params[i]));
}
if (i == 2)
{
p.setEndDate(DateOperation.strToDate(params[i]));
}
}
//p = new PeopleOut(params[0], DateOperation.strToDate(params[1]), DateOperation.strToDate(params[2]));
p.countBuTie();
list.add(p);
}
}
catch (FileNotFoundException e)
{
System.out.println("檔案未找到!");
e.printStackTrace();
}
catch (IOException e)
{
System.out.println("檔案讀取失敗!");
e.printStackTrace();
}
finally
{
if (br != null)
{
try
{
br.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return list;
}
}
package com.neusoft.exam;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
/**
*
* <b>Application name:</b>Exam<br>
* <b>Application describing:</b>日期操作工具類 <br>
*/
public class DateOperation
{
/**
* 日期格式轉換格式
*/
public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
/**
* 一天的毫秒數
*/
public static final long interval = 1000L * 24 * 60 * 60;
/**
*
* {日期轉換成字串函式}
*
* @param calendar
* @return
*/
public static String dateToStr(Calendar calendar)
{
String str = null;
str = sdf.format(calendar.getTime());
return str;
}
/**
*
* {計算兩個日期之間相差的天數}
*
* @param startCal
* @param endCal
* @return
*/
public static int daysBetween(Calendar startCal, Calendar endCal)
{
if (startCal != null && endCal != null)
{
if (startCal.after(endCal))
{
throw new IllegalArgumentException("引數非法,開始時間不能大於結束時間");
}
long start = startCal.getTimeInMillis();
long end = endCal.getTimeInMillis();
int res = (int) ((end - start) / interval + 1);
return res;
}
else
{
return 0;
}
}
/**
*
* {字串轉換成日期方法 }
*
* @param str
* @return
*/
public static Calendar strToDate(String str)
{
Calendar calendar = null;
try
{
calendar = Calendar.getInstance();
calendar.setTime(sdf.parse(str));
}
catch (ParseException e)
{
//throw new RuntimeException(e);
System.out.println("格式解析錯誤!");
e.printStackTrace();
}
return calendar;
}
}
package com.neusoft.exam;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
*
* <b>Application name:</b>Exam<br>
* <b>Application describing:</b>Properties檔案操作工具類 <br>
*/
public class PropertyOperation
{
/**
*
* {讀取磁碟上的properties檔案資訊}
*
* @param filePath
* @return
*/
public static Properties readProperty(String filePath)
{
Properties properties = new Properties();
InputStream is = null;
try
{
is = new FileInputStream(filePath);
properties.load(is);
}
catch (FileNotFoundException e)
{
System.out.println("沒有找到檔案");
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
if (is != null)
{
try
{
is.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return properties;
}
}