业务需求
需要echarts做一个折线图,查询出结果后放到图中发现没有数据的日期并没有那天的数据,图有点不搭。
开始找解决办法,从sql上解决,找了很多之后发现大同小异都是需要建表来关联查询。
那就换种办法,从代码上解决吧。
解决办法
一开始的数据是这样的
[
{
"date": "2018-03-26",
"count": 0,
"id": null
},
{
"date": "2018-03-29",
"count": 0,
"id": null
},
{
"date": "2018-03-30",
"count": 1,
"id": null
},
{
"date": "2018-03-31",
"count": 2,
"id": null
}
]
自己定义了list将日期取出,开始补全日期。
写了个方法方便自己调用,list为日期list。begin将开始的日期传入,daySub为开始到结束日期之间的总天数,返回的是补全后的日期。
public static List<String> completionDate(List<String> list ,String begin , int daySub){
ArrayList<String> dateResult = new ArrayList<String>();
//时间增加一天
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar yesterday = Calendar.getInstance();
yesterday.add(Calendar.DAY_OF_MONTH, 1);
String dateStr = sdf.format(yesterday.getTime());
//日期比较(求差多少天),时间也可以比较
Calendar now = Calendar.getInstance();
//字符串转化为时间
Calendar calendar10 = Calendar.getInstance();
Calendar calendar5 = Calendar.getInstance();
//循环处理日期数据,把缺失的日期补全。10是时间段内的天数,5是要处理的日期集合的天数
try {
Date date = sdf.parse(begin);
calendar10.setTime(date);
} catch (ParseException e) {
e.printStackTrace();
}
for(int curr = 0 ; curr < daySub ; curr++){
boolean dbDataExist = false;
int index = 0;
for(int i = 0 ; i < list.size() ; i++){
try {
Date date2 = sdf.parse(list.get(i));
calendar5.setTime(date2);
} catch (ParseException e) {
e.printStackTrace();
}
if(calendar10.compareTo(calendar5) == 0){
dbDataExist = true;
index = i;
break;
}
}
if(dbDataExist){
dateResult.add(list.get(index));
}else{
dateResult.add(sdf.format(calendar10.getTime()));
}
//还原calendar10
calendar10.add(Calendar.DAY_OF_MONTH, 1 );
}
return dateResult;
}
补全的日期list到手,接下来要将原来不存在的日期的数值补充为0。实现也很简单。
先定义map将原来的日期和值放进去,得到新的补全后list后遍历通过map取值,如果为空就是添加的日期,将value赋值为0,最后返回新的集合就行。