文档章节

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

晚天吹凉风
 晚天吹凉风
发布于 2017/02/28 17:12
字数 958
阅读 2
收藏 0
点赞 0
评论 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
博文 103
码字总数 40311
作品 0
芜湖
程序员
做统计报表常用的设计思路

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

长平狐 ⋅ 2012/10/11 ⋅ 0

数据统计系统设计思路遇挫,求救.

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

大苹果 ⋅ 2011/05/06 ⋅ 5

商城开发方案书

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

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

HAWQ取代传统数仓实践(十七)——事实表技术之累积度量

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

wzy0623 ⋅ 2017/06/09 ⋅ 0

HAWQ取代传统数仓实践(十六)——事实表技术之迟到的事实

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

wzy0623 ⋅ 2017/06/08 ⋅ 0

MySQL 常用语法总结

一、SQL速成 结构查询语言(SQL)是用于查询关系数据库的标准语言,它包括若干关键字和一致的语法,便于数据库元件(如表、索引、字段等)的建立和操纵。 以下是一些重要的SQL快速参考,有关SQL...

长平狐 ⋅ 2013/01/06 ⋅ 0

HBase MOB压缩分区策略介绍

介绍 HBase MOB特性是在HBASE-11339中引入,这一特性改善了对中等大小值的低延迟读写(基于我们的测试结果理想状态是100K到10M),这使得可以更好的存储文本,图片和一些其他的中等对象[1],H...

HBase技术社区 ⋅ 04/20 ⋅ 0

sql高手请进:排序、统计

本人想要实现某产品的销量统计,算法如下: 前两天的销量比较:如果前天比昨天高,则标记为正1;低,则标记为负1; 若持平,则标记为0. 并且按销量由高到低排序。 求高手一条sql语句解决(多...

石湖山庄 ⋅ 2012/12/11 ⋅ 7

电商的数据分析累计--订单篇

订单数据从产生到结果,期间需要经验各种的状态流转,最终再得做退换货。 那么会用到哪里关键的字段呢:支付状态、订单状态、订单类型、支付金额、应付金额、已付金额。 个人感觉 目前的设计...

GarenBean ⋅ 2016/05/10 ⋅ 0

开源电子商务网店程序--海盗云商

海盗云商(Haidao)网店系统是一个用php+MySQL进行开发的网店类网站,网站包括了PC端和手机端两种界面。 海盗云商2.0内置功能介绍(更多功能通过插件及模块拓展) 站点设置:负责商城全局站点设...

古人灏 ⋅ 2016/02/03 ⋅ 5

没有更多内容

加载失败,请刷新页面

加载更多

下一页

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部