三天打鱼两天晒网

问题描述

中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。

解题思路

  1. 存储日期到in.txt文件:采用BufferOutPutStream字节缓冲流对FileOutPutStrean进行了包装以便提高效率、保护磁盘。
  2. 从in.txt文件读取日期:采用BufferReader对FileReader进行包装,使用ReadLine()可以读取一行数据。
  3. 输入判断:采用DateFormat类的setLenient(false)方法可以设置不宽松解析,然后使用parse()方法可判断输入日期是否合法,使用正则表达式可判断输入格式是否正确。
  4. 计算时间差:主要采用了Calendar类的add()方法来计算时间间隔。一直从2010年1月1日开始做加1天的操作,当加到某天的日期和输入的日期相等了,相加的次数则为相隔的天数,流程图如图一所示。
  5. 渔夫情况判断:时间差对5取余,如果为1,2,3则渔夫在打鱼,否则,晒网。

代码

/**
     * 此方法比较两个Calendar时间是否相等
     * @param begin 第一个Calendar对象
     * @param end 第二个Calendar对象
     * @return 当begin与end所表示的时间为同一天则返回ture,否则false
     */
    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对象,分别表示开始时间和结束时间
        Calendar beginCalender = Calendar.getInstance();
        Calendar endCalender = Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        //将表示时间的String字符串解析为Date类型
        Date endTime = format.parse(end);
        Date beginTime = format.parse(begin);
        //初始化Calendar对象
        beginCalender.setTime(beginTime);
        endCalender.setTime(endTime);
        int count=1;//记录天数
        while(!compareDate(beginCalender,endCalender)) {
            //当开始时间和结束时间不相等时给开始时间+1天,并且为记录天数的count+1
            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);//通过parse()判断输入是否合法
                    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();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值