递归( 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;
}
这算是学习算法在实际中的一次应用,完成后在想想很是简单,可是在编程时也是调试了一会才对的.主要还是思路不是很清楚,还是要加强些才好.