文档章节

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());
}

© 著作权归作者所有

共有 人打赏支持
晚天吹凉风
粉丝 3
博文 110
码字总数 40311
作品 0
芜湖
后端工程师
私信 提问
选材网统计功能参考,大家补充一下!也可以去分享处下载

1 店铺统计 1.1 流量统计 1.1.1 店铺总流量 统计条件:本周/本月/本年/时间段 统计图: x坐标:日/月 y坐标:次数 1.1.2 商品流量排名 统计条件:本周/本月/本年/时间段 统计图: x坐标:次数...

chaogetu
2015/05/06
2
0
做统计报表常用的设计思路

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

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

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

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

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

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

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

桃子红了呐
2017/04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
10
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
17
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
11
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部