统计一段时间内的连续时间,每天的数据,无数据则补0

统计一段时间内的连续时间(以天为单位)无数据则补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里的两个集合(前端叫数组),分别是横坐标、纵坐标

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神雕大侠mu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值