统计一段时间内的连续时间(以天为单位)无数据则补0。
项目中常用到这种统计,类似柱状图,或者曲线趋势图,要求时间连续。数据若无则补0
/**
* 获取连续的时间,比如统计近一周的数据,返回时间集合(这里以每天作单位)
*/
public static List<String> getTimeList(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<String> dateList = new ArrayList<>();
/**
* 用Calendar.getInstance()不仅能获取当前的时间,还能指定需要获取的时间点
*/
Calendar calendar = Calendar.getInstance();
/**
* 设定当前日期
*/
calendar.setTime(new Date());
//这里设定30,可以根据需要随便设获取多久时间
int tip = Integer.valueOf(30)-1;
/**
* cal1.add(Calendar.DAY_OF_MONTH,1);
* cal1.add(Calendar.DAY_OF_YEAR,1);
* cal1.add(Calendar.DATE,1);
* 就单纯的add操作结果都一样,因为都是将日期+1
* 就没有区别说是在月的日期中加1还是年的日期中加1
*这里是设定指定时间的起始时间,比如30天前的日期
*/
calendar.add(Calendar.DAY_OF_MONTH,-tip);
dateList.add(sdf.format(calendar.getTime()));
/**
*每循环一次,日期加1,把每天的时间装进集合
**/
for(int i=0;i<tip;i++){
calendar.add(Calendar.DAY_OF_MONTH,1);
dateList.add(sdf.format(calendar.getTime()));
}
return dateList;
}
/**
* 根据连续日期获取对应的连续数据,无数据则添0
* @return
*/
public Map<String,Object> getContinuData(){
List<String> timeList = getTimeList();
/**
*获取起始,结束时间
**/
String startTime = timeList.get(0);
String endTime = timeList.get(timeList.size()-1);
//去数据库获取这段时间的数据(有可能有的没有数据,所以要用下面代码给未获取到的补0)
List<Map<String,Object>> list = rrTsVulthreadMapper.getImportantTrend(startTime,endTime);
/**
* 把list组装成map,这里是以每条数据的name字段作key,value字段作value
* 记住list转map的方法
*/
Map<String, Integer> assembleMap = list.stream().
collect(Collectors.toMap(n -> n.get("name").toString(),
m -> Integer.valueOf(m.get("value").toString())));
Map<String,Object> map = new HashMap<>();
List<Integer> y = new ArrayList<>();
/**
* 判断每个时间是否有值,没获取到值得补0
*/
for(String s : timeList){
if(assembleMap.containsKey(s)){
y.add(assembleMap.get(s));
}else {
y.add(0);
}
}
map.put("x",timeList);
map.put("y",y);
return map;
}
这样就会得到map里的两个集合(前端叫数组),分别是横坐标、纵坐标