自我发现二叉树在项目中的实际应用

文章讲述了作者在统计近30天、7天内的订单量时,遇到数据库缺失某些日期数据的问题。通过使用二叉树(红黑树)存储已有的数据,实现快速查找并填充缺失数据,显著提高了查询效率。
摘要由CSDN通过智能技术生成

毕设之后台天数范围内成交趋势

情况描述:在统计近30天、7天等在一个范围内的数据时,如果数据库中没有某些天的数据时,需要自己封装这些日期,并设置数量为0。但是每天的日期是动态发生变化的不是死的。

例如我要查询3/01 ~ 3/31 之间每天的订单量,可是我是一个小网站,可能3/05 3/08 3/09... 等某些天中根本没有人下单,那我这些天的数据根本查询不到。

想过循环嵌套,外部遍历日期集合,内部遍历SQL的查询结果,比对日期。如果哪天没有数据 ==null,直接给0。发现太耗时了需要每次都得从头比较。不能够保证顺序。需要自己判定那一天没有数据。

随即就立马想到了不如把已存在的数据集合存到二叉树(红黑树更好)里,以日期为key,销量/收入等存为value。这样只需要遍历一次日期集合(有序的),内部通过日期就直接获取到相关的信息,不需要二次遍历,且二叉树的查找也快,如果为空就直接设置为0。

首先自己先封装了一个方法,用于获取给定数字的日期范围集合,比如今天是3/12,输入7,返回的集合就是从3/5 ~ 3/11

/**
     * 获取天数范围内的日期集合
     * @param objDay 范围值 例如7天、30天
     */
    private List<String> getQueryDate(int objDay){
        List<String> queryDate = new ArrayList<>();
        //昨天的日期
        LocalDateTime endDate = LocalDateTime.now().minusDays(1);
        LocalDateTime startDate = endDate.minusDays(objDay - 1);
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        //遍历日期
        for (;!startDate.isAfter(endDate);startDate = startDate.plusDays(1)){
            queryDate.add(dateTimeFormatter.format(startDate));
        }
        return queryDate;
    }

接下来就是根据返回的日期范围查询结果集,并生成二叉树,最后循坏赋值

 //日期集合
            List<String> queryDateList = getQueryDate(queryDay);
            //结果集合
            validOrders = ordersMapper.queryOrderAmountInRecentOneMonth(queryDateList);
            //想办法把结果集弄好 试试二叉树 -> 已完成
            BinaryTree binaryTree = new BinaryTree();
            validOrders.forEach(item -> {
                binaryTree.insert(item.getXDate(),item.getOrderNum());
            });
            validOrders.clear();
            queryDateList.forEach(curDate -> {
                //没有找到
                Object curNum = binaryTree.get(curDate);
                if (curNum == null){
                    validOrders.add(new ValidOrder(0,curDate.substring(curDate.indexOf("/") + 1)));
                }else {
                    log.info("orderNum:{},curDate:{}", curNum,curDate.substring(curDate.indexOf("/") + 1));
                    validOrders.add(new ValidOrder((int)curNum,curDate.substring(curDate.indexOf("/") + 1)));
                }
            });

红黑树自平衡,更优秀。小白乱写总结,勿喷

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值