文档章节

17年2月末用时两天的(按周统计订单金额)

晚天吹凉风
 晚天吹凉风
发布于 2017/02/28 17:12
字数 958
阅读 3
收藏 0

已知:

List<Order> 其数据为

pay_type 1 1 2 2
date 2017-01-01 2017-01-02 2017-02-01 2017-02-02
total_price 10 20 30 20

List<String> dateList 其数据为

date 2017-01-01~2017-01-07 2017-02-01~2017-02-07

最后转换成

pay_type 1 2
date 2017-01-01~2017-01-07 2017-02-01~2017-02-07
total_price 30 50

刚开始编写的时候思路很乱,花了一天半的时间,愣是搞不出来。当时百度了Map根据key值去重,map遍历,map根据key合并,String的方法等等,愣是搞了一天没搞出来。之后导师开始把难度降低,但是发现自己之前写的代码原来只需要改动一些,而自己却绕了一个大圈。

1、先不考虑pay_type参数

public static void main(String[] args) {
    List<Map> orderList = new ArrayList<Map>();
    Map order = new HashMap();
    //order.put("pay_type", 1);
    order.put("date", "2017-01-01");
    order.put("price", 10);
    orderList.add(order);
    order = new HashMap();
    //order.put("pay_type", 1);
    order.put("date", "2017-01-04");
    order.put("price", 20);
    orderList.add(order);
    order = new HashMap();
    //order.put("pay_type", 2);
    order.put("date", "2017-02-01");
    order.put("price", 30);
    orderList.add(order);
    order = new HashMap();
   //order.put("pay_type", 2);
    order.put("date", "2017-02-02");
    order.put("price", 30);
    orderList.add(order);

    List<String> dateList = new ArrayList<String>();
    dateList.add("2017-01-01~2017-01-07");
    dateList.add("2017-02-01~2017-02-07");

    List<Map> tempList = new ArrayList<Map>();
    for (String timeDate : dateList) {//循环时间集合
        Map map = new HashMap();
        String[] dates = timeDate.split("~");
        String date1 = dates[0];//获取时间段的起始时间
        String date2 = dates[1];//获取时间段的结束时间
        map.put("date", timeDate);//将时间段put到订单orders中
        double orderTotal = 0.0;//订单总额
        for (Map map1 : orderList) {//循环订单集合
            if (map1.get("date").toString().compareTo(date1) >= 0 && map1.get("date").toString().compareTo(date2) <= 0) {//如果订单的时间大于等于起始时间且小于等于结束时间 时间段put到orders中
                orderTotal = orderTotal + Double.valueOf(map1.get("price").toString());//属于同一时间段的订单金额相加
            }
        }
        map.put("price", orderTotal);//将订单总金额put到map中
        tempList.add(map);//添加
    }
    System.out.println(tempList);//tempList.size() 判断一个集合list的大小在循环中 看add()了多少次 其他代码不看
}

2、把pay_type参数考虑进去

刚开始思路也是有点乱,循环出错,原因是我要得到的结果的size为4,而我的循环最后list的size明显不对。在循环,像是多个循环时,先判断好,谁是最外层循环,谁内层循环,为什么这样做。

public static void main(String[] args) {
    List<Map> orderList = new ArrayList<Map>();
    Map order = new HashMap();
    order.put("pay_type", 1);
    order.put("date", "2017-01-01");
    order.put("price", 10);
    orderList.add(order);
    order = new HashMap();
    order.put("pay_type", 1);
    order.put("date", "2017-01-04");
    order.put("price", 20);
    orderList.add(order);
    order = new HashMap();
    order.put("pay_type", 1);
    order.put("date", "2017-02-04");
    order.put("price", 15);
    orderList.add(order);
    order = new HashMap();
    order.put("pay_type", 2);
    order.put("date", "2017-01-03");
    order.put("price", 17);
    orderList.add(order);
    order = new HashMap();
    order.put("pay_type", 2);
    order.put("date", "2017-01-02");
    order.put("price", 13);
    orderList.add(order);
    order = new HashMap();
    order.put("pay_type", 2);
    order.put("date", "2017-02-02");
    order.put("price", 30);
    orderList.add(order);
    order = new HashMap();
    order.put("pay_type", 2);
    order.put("date", "2017-02-03");
    order.put("price", 30);
    orderList.add(order);

    List<String> dateList = new ArrayList<String>();
    dateList.add("2017-01-01~2017-01-07");
    dateList.add("2017-02-01~2017-02-07");

    List<Integer> tempList = new ArrayList<Integer>();//新建list集合 存放pay_type
    for (Map map : orderList) {//循环订单集合
        int payType = Integer.valueOf(map.get("pay_type").toString());
        if (!tempList.contains(payType)) {
            tempList.add(payType);//添加到集合中
        }
    }

    List<Map> resultList = new ArrayList<Map>();//新建集合存放结果  这里list的类型是Map所以要想到新建Map对象 然后往里面put值
    for (Integer tempPay : tempList) {
        for (String timeDate : dateList) {//循环时间集合
            Map map = new HashMap();
            map.put("pay_type", tempPay);
            String[] dates = timeDate.split("~");//正则表达式 调用String的split的方法去除~字符
            String date1 = dates[0];//获取时间段的起始时间
            String date2 = dates[1];//获取时间段的结束时间
            map.put("date", timeDate);
            double totalPrice = 0.0;//定义订单总金额
            for (Map map1 : orderList) {
                if (tempPay.equals(Integer.valueOf(map1.get("pay_type").toString()))) {
                    if (map1.get("date").toString().compareTo(date1) >= 0 && map1.get("date").toString().compareTo(date2) <= 0) {//如果订单的时间大于等于起始时间且小于等于结束时间 时间段put到orders中
                        totalPrice += Double.valueOf(map1.get("price").toString());
                    }
                }
            }
            map.put("price", totalPrice);
            resultList.add(map);
        }
    }
    System.out.println(resultList+"----"+resultList.size());
}

© 著作权归作者所有

共有 人打赏支持
晚天吹凉风
粉丝 4
博文 110
码字总数 40311
作品 0
芜湖
程序员
做统计报表常用的设计思路

最近做一个项目中碰到一个这样的问题: 业务数据保存的表如下:订单主表,订单明细表,订单备货表,订单到货表,结算金额表;(实际上还有一套历史记录表) 其中订单备货表就是订单明细表,用...

长平狐
2012/10/11
116
0
数据统计系统设计思路遇挫,求救.

按照惯例,先描述场景. 首先此系统是用来统计的,对用户数据进行统计.要求可以按小时,日,周,月来查询. 每日有200w+的用户量,按照每个用户有20个操作来算.要处理4000w+的请求. 一 最早的想法,是...

大苹果
2011/05/06
723
5
HAWQ取代传统数仓实践(十七)——事实表技术之累积度量

累积度量指的是聚合从序列内第一个元素到当前元素的数据,例如统计从每年的一月到当前月份的累积销售额。本篇说明如何在销售订单示例中实现累积月销售数量和金额,并对数据仓库模式、初始装载...

wzy0623
2017/06/09
0
0
商城开发方案书

商城开发方案书 一、项目简介 项目名称 :易商城 项目设计方:点多多科技 项目简介 :项目总体由两个部分组成,管理员端与商城端, 管理员端对商城进行总的管理,包括商品分类管理、商品管理...

桃子红了呐
2017/04/30
0
0
HAWQ取代传统数仓实践(十六)——事实表技术之迟到的事实

一、迟到的事实简介 数据仓库通常建立于一种理想的假设情况下,这就是数据仓库的度量(事实记录)与度量的环境(维度记录)同时出现在数据仓库中。当同时拥有事实记录和正确的当前维度行时,...

wzy0623
2017/06/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

内存模型是怎么解决缓存一致性的?

在再有人问你Java内存模型是什么,就把这篇文章发给他。这篇文章中,我们介绍过关于Java内容模型的来龙去脉。 我们在文章中提到过,由于CPU和主存的处理速度上存在一定差别,为了匹配这种差距...

Java填坑之路
12分钟前
1
0
vue-cli 3.0 初体验

最近复习了下vue,突然发现vue-cli已经更新到3.0版本了,并且变化蛮大,看来要不停的学习,真是一入前端深似海。 安装步骤: 1、全局安装 npm install -g @vue/cli Vue CLI 的包名称由 vue-...

tianyawhl
14分钟前
0
0
Angular进阶之路

【初级】会写页面,能出东西。 给定环境和 rest API,不用第三方库,能在十分钟内完成一个 master/detail 结构的带路由的应用(可以不管美观)。 知识点:Angular CLI、组件、路由、HTTP 服务...

陆小七的主页
16分钟前
0
0
Redis缓存数据库安全加固指导(一)

背景 在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2018年国外数据库技术权威网站DB-Engines关于key-value数据库流行度排名,Redis暂列第一位,但是原生...

中间件小哥
17分钟前
0
0
百万级数据mysql分区

1. 什么是表分区? 表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。 2. 表分区与分表的区别 分表...

罗文浩
19分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部