17年2月末用时两天的(按周统计订单金额)
17年2月末用时两天的(按周统计订单金额)
晚天吹凉风 发表于8个月前
17年2月末用时两天的(按周统计订单金额)
  • 发表于 8个月前
  • 阅读 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());
}
共有 人打赏支持
粉丝 0
博文 19
码字总数 28523
评论 (0)
×
晚天吹凉风
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: