某公司为其它公司做技术服务,人员按照客户要求出差外派。补贴是在人员出差前预先派发的。需要计算出每个人的补贴数值,并且需要派出日期先后排序,以便于安排进行统一借款并进行补贴的派发。如果派出日期相同,则按照补贴金额从少到多排序。

按照出差时间长短,补贴的标准是不同的。具体规定是:
    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;
}
}

java程序之出差补助计算相关推荐

  1. 计算体质指数BMI的java程序,如何正确的计算体质指数BMI。

    如何正确的计算体质指数BMI. 答:BMI=体重/身高2 正式把建立社会主义市场经济体制确立为我国经济体制改革的目标的会议是( ) 答:党的十四大 我国肾综合征出血热最主要的传染源是: 答:黑线姬鼠 ...

  2. java 启动多个jvm实例_当多个Java程序在同一台计算机上运行时

    小编典典 1)如果我有一个用Java编写的Web服务,它将需要一个JVM实例来运行.那么可以将JVM设为守护进程吗? 是的,它可以.如何完成取决于O / S和Web服务器容器本身. 2)如果是,当我们 ...

  3. 我的第一个Java程序

    开始第一个Java程序 保证你的计算机上有一个文本编辑器 安装JDK[一般JDK在官网下载] JDK.JRE.JVM的关系 JDK目录的介绍 JDK/bin:该目录下存放了很多命令,例如javac.e ...

  4. 计算硼原子的基态能级的java程序

    这个程序由2个java程序,1个python程序共3部分构成,具体包括 public class eneB:用于计算硼原子的动能,势能,库仑能和相互作用能 public class overlap3: ...

  5. Java 练习:编写 Java 程序,输入年份和月份,使用 switch 结构计算对应月份的天数。月份为 1、3、5、7、8、10、12 时,天数为 31 天。月份为 4、6、9、11 时,天数为 3

    文章目录 一.练习题目 二.使用 switch 语句实现代码 三.将代码改写回 if else 的选择结构 一.练习题目 编写 Java 程序,输入年份和月份,使用 switch 结构计算对应月份的天 ...

  6. Jaccard文本相似度计算 Java程序

    本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 内容可能有不到之处,欢迎交流. Jaccard相似系数 两个集合A和B交集元素的个数在A.B并集中所占的比例,称 ...

  7. 怎样通过Java程序提交yarn的mapreduce计算任务

    因为项目需求,须要通过Java程序提交Yarn的MapReduce的计算任务.与一般的通过Jar包提交MapReduce任务不同,通过程序提交MapReduce任务须要有点小变动.详见下面代码. 下面 ...

  8. 你的java程序有没有内存泄露,java进程在linux系统中rss计算方式是什么样的?

    java进程在linux系统中rss计算方式如下: RSS = Heap size + MetaSpace + OffHeap size 其中OffHeap由线程堆栈,直接缓冲区,映射文件(库和jar ...

  9. 编写一个简单Java程序,计算银行年存款的本息

    编写一个简单Java程序,计算银行年存款的本息 要求:程序运行后要求用户输入存款本金.年利率和存款年限,最后程序计算并输出相应年限后存款的金额.相应的计算公式为:存款总额=本金 * (1 + 利率)存 ...

最新文章

  1. sql server 的一些记录
  2. COW奶牛!Copy On Write机制了解一下
  3. NTP时间服务相关基础及配置文件详解
  4. 【转】NAST表的使用
  5. 在游戏里模拟天空的颜色,太迷人了!
  6. ajax 请求调用问题
  7. 用户密码登录改造实现
  8. 80-30-010-原理-React模式-简介
  9. html漂亮的表格模板+背景_咨询amp;金融主题响应式网站着陆页模板
  10. PHP 7.3 比 PHP 7.0 快 22%,即将进入特性冻结阶段
  11. python能做什么程序-python能做哪些生活有趣的事情
  12. 易编远航第三期第3期第4套-游戏大厅脚本开发集合
  13. 四阶龙格库塔法解一维扩散方程
  14. Bandicam(班迪录屏)破解注册机
  15. word 大纲视图的生成
  16. 排序公式 与 组合公式
  17. 事态升级管理程序范本_项目管理事态升级流程
  18. 如何识别哭泣csdn_【jji技术】语音识别工程实战:聊聊语音芯片选型
  19. free rainbow 分布式破解 WINDOWS 密码的最好选择!
  20. pytorch实现word_embedding(negative_sampling的skip-gram模型)

热门文章

  1. Codimd接入单点登录
  2. Vue - v-if和v-else-if和v-else的使用
  3. 大数据课程A3——云主机概况和使用(补充说明)
  4. SQL语句(五)子查询
  5. 音视频开发——音视频学习资料
  6. 你真的需要一个(专门的)向量数据库么
  7. Android翻页入门
  8. zigbee与其它近距离无线通信技术的比较
  9. 直播客户端架构设计与开发-DQLive for Android
  10. c语言编译错误信息详细解释,C语言编译错误信息说明大全