问题描述
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。
解题思路
- 存储日期到in.txt文件:采用BufferOutPutStream字节缓冲流对FileOutPutStrean进行了包装以便提高效率、保护磁盘。
- 从in.txt文件读取日期:采用BufferReader对FileReader进行包装,使用ReadLine()可以读取一行数据。
- 输入判断:采用DateFormat类的setLenient(false)方法可以设置不宽松解析,然后使用parse()方法可判断输入日期是否合法,使用正则表达式可判断输入格式是否正确。
- 计算时间差:主要采用了Calendar类的add()方法来计算时间间隔。一直从2010年1月1日开始做加1天的操作,当加到某天的日期和输入的日期相等了,相加的次数则为相隔的天数,流程图如图一所示。
- 渔夫情况判断:时间差对5取余,如果为1,2,3则渔夫在打鱼,否则,晒网。
代码
public static boolean compareDate(Calendar begin,Calendar end) {
boolean flag = false;
if(begin.get(Calendar.YEAR)==end.get(Calendar.YEAR)&&begin.get(Calendar.MONTH)==end.get(Calendar.MONTH)&&begin.get(Calendar.DATE)==end.get(Calendar.DATE))
flag=true;
return flag;
}
/**
* @param begin 开始时间
* @param end 结束时间
* @return 由begin时间到end时间所经历的天数
*/
public static int getInterValDay(String begin,String end) throws ParseException {
Calendar beginCalender = Calendar.getInstance();
Calendar endCalender = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date endTime = format.parse(end);
Date beginTime = format.parse(begin);
beginCalender.setTime(beginTime);
endCalender.setTime(endTime);
int count=1;
while(!compareDate(beginCalender,endCalender)) {
beginCalender.add(beginCalender.DATE,1);
count++;
}
return count;
}
/**
* 该方法用于用户输入日期到文件
*/
public static void inPutDate() throws IOException {
Scanner sc =new Scanner(System.in);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("e:/in.txt"));
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
format.setLenient(false);
while(true) {
System.out.println("请以yyyy-MM-dd格式输入日期");
String date = sc.next();
try {
if(!date.matches("[0-9]{4}-[0-9]{2}-[0-9]{2}")) {
System.out.println("输入的格式不正确,请重新输入");
continue;
}else {
format.parse(date);
bos.write(date.getBytes());
bos.write("\r\n".getBytes());
System.out.println("是否继续输入?Y/N");
String op = sc.next();
if(op.equals("Y")||op.equals("y")) {
continue;
}else {
System.out.println("日期输入结束……");
bos.close();
break;
}
}
} catch (ParseException e) {
System.out.println("输入日期不合法,请重新输入!!!");
}
}
}
/**
*
* 读取输入日期信息,根据信息读取获取结果
*/
public static void getResult() throws IOException, ParseException {
BufferedReader br = new BufferedReader(new FileReader("e:/in.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("e:/out.txt"));
String date;
System.out.println("正在计算……");
while((date=br.readLine())!=null) {
int interValDay = getInterValDay("2010-01-01",date);
if(interValDay%5==1||interValDay%5==2||interValDay%5==3) {
bw.write("打鱼");
bw.write("\r\n");
}else {
bw.write("晒网");
bw.write("\r\n");
}
}
System.out.println("计算结束,请于out.txt查看结果");
bw.close();
br.close();
}