算法学习:递归的应用--将日期段按年划分

递归( recursion)即程序调用自身.在学习变成中肯定会提到的一个话题.
正好,今天在代码中需要将一个时间段按年来划分开,例如取2014-09-16~2016-09-15区间段每一年的值为:2014-09-16~2014-12-31、2015-01-01~2015-12-31,2016-01-01~2016-09-15.于是脑袋中就想到了递归算法.
实现起来也很简单,

  • 将开始日期和结束日期作为条件传入,然后判断开始日期小于结束日期则继续执行.
  • 在判断是否为同一年,不是则继续执行,并将开始年加一年,开始递归
  • 是的话则递归结束
  • 同时,如果第一个条件不满足,递归也结束
    这就是基本的步骤了,思路清楚了,代码实现起来就简单了.
/**
     * 将日期段按年划分
     * 例如取2014-09-16~2016-09-15区间段每一年的值为:2014-09-16~2014-12-31、2015-01-01~2015-12-31,2016-01-01~2016-09-15
     * @param toBeginDate
     * @param toEndDate
     * @param list
     * @return
     */
    public static List<String> getYearList(String toBeginDate, String toEndDate,List<String> list){
        if(list==null&&list.size()<0){
            list = new ArrayList<String>();
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar beginCal= Calendar.getInstance();
        Calendar endCal= Calendar.getInstance();
        try {
            beginCal.setTime(sdf.parse(toBeginDate));
            endCal.setTime(sdf.parse(toEndDate));

            //开始日期小于结束日期
            if(beginCal.compareTo(endCal)<= 0){
                StringBuffer year= new StringBuffer(sdf.format(beginCal.getTime()));
                //不是同一年
                if(beginCal.get(Calendar.YEAR)<endCal.get(Calendar.YEAR)){
                    year.append("~").append(sdf.format(beginCal.getTime()).substring(0,5)+"12-31");
                    beginCal.add(Calendar.YEAR, 1);
                    getYearList(sdf.format(beginCal.getTime()).substring(0,5)+"01-01",toEndDate,list);
                }
                //同一年
                else{
                    year.append("~").append(sdf.format(endCal.getTime()));
                }
                list.add(year.toString());
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return list;
    }

这算是学习算法在实际中的一次应用,完成后在想想很是简单,可是在编程时也是调试了一会才对的.主要还是思路不是很清楚,还是要加强些才好.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值