博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
17年2月末用时两天的(按周统计订单金额)
阅读量:6214 次
发布时间:2019-06-21

本文共 4498 字,大约阅读时间需要 14 分钟。

hot3.png

已知:

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 orderList = new ArrayList();    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
dateList = new ArrayList
(); dateList.add("2017-01-01~2017-01-07"); dateList.add("2017-02-01~2017-02-07"); List
tempList = new ArrayList(); 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 orderList = new ArrayList();    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
dateList = new ArrayList
(); dateList.add("2017-01-01~2017-01-07"); dateList.add("2017-02-01~2017-02-07"); List
tempList = new ArrayList
();//新建list集合 存放pay_type for (Map map : orderList) {//循环订单集合   int payType = Integer.valueOf(map.get("pay_type").toString()); if (!tempList.contains(payType)) { tempList.add(payType);//添加到集合中 } } List
resultList = new ArrayList();//新建集合存放结果 这里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());}

转载于:https://my.oschina.net/inchlifc/blog/847907

你可能感兴趣的文章
重置centos 7 root密码
查看>>
【移动开发】WIFI热点通信(一)
查看>>
SQL Server2008附加数据库之后显示为只读时解决方法
查看>>
项目实施人员请做到天时地利人和
查看>>
投票送广交会资料!
查看>>
苹果公司遭欧盟调查 涉嫌勾结书商操控电子书价
查看>>
python 文件处理、数据持久化与正则
查看>>
mongodb部署一个集群
查看>>
java多线程
查看>>
netty框架的学习笔记 + 一个netty实现websocket通信案例
查看>>
我的友情链接
查看>>
求职之我见
查看>>
【转】牛逼闪闪的Ruby迭代器
查看>>
Windows 8 企业部署系列之(八)
查看>>
Zend Studio 主題更改
查看>>
echarts 设置地图默认缩放比例 尺寸
查看>>
PHP内存池中的存储层
查看>>
PHP开发APP接口1——APP接口简介
查看>>
家用nas的过去现在和未来--2008n年
查看>>
Linux安装Zend Guard 和 ioncube
查看>>