大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂

前言

最近写代码的时候遇到了个需求,刚开始想的时候,感觉不难,挺简单的,结果写的时候,各种思考、各种费脑,耗费了点时间,终于实现了。

需求:因为一些原因,数据库中有两个表,结构一样且数据不一样,现在需要对这两个表进行按照小时分组统计数据,然后展示在前台。

效果如下:


需要将两个表中各个时间段的数据相加,然后重新封装返回到前台做展示。

思路分析

  • 分别按照小时分组查询两个表中的数据,查询出来的结构是一个List<Map>集合

  • 先将第一个表的结果放在一个map集合中。

  • 然后去遍历第二个结果的map集合,拿到key,去和第一个map集合的key比较,如果时间正好相等,则将两个结果的value相加,最后得到一个总的map集合

  • 将总的map集合的键和值分别取出来放在VO类中,最后在前台遍历展示。

下面贴一下实现代码。

代码实现

分别查询两个表中的数据,封装成List<Map>的形式传出去。

public List<Map<String, Object>> getFlowsHoursDiSanFangByProvince(Integer proId){Map<String,Object> map = new HashMap<String,Object>();List<Map> mapList = new ArrayList<>();List<Map<String, Object>> nameList = new ArrayList<>();String sql=" SELECT SUM(acq_num_of_people) flows,DATE_FORMAT(acq_time,'%H') AS hours FROM base_disanfang \n" +"        WHERE DATE(acq_time) = CURDATE()\n" +"          AND province_id = ? \n" +"        GROUP BY  DATE_FORMAT(acq_time,'%H')";Connection connection = null;PreparedStatement pStatement = null;connection = getConnection();try {pStatement = connection.prepareStatement(sql);pStatement.setObject(1,proId);ResultSet rs=pStatement.executeQuery();while(rs.next()){map = new HashMap<String,Object>();map.put("value",rs.getInt(1));map.put("name",rs.getString(2));nameList.add(map);}} catch (SQLException throwables) {throwables.printStackTrace();}//return JSONArray.toJSONString(mapList);return nameList;}
public List<Map<String, Object>> getFlowsHoursThreeByProvince(Integer proId){Map<String,Object> map = new HashMap<String,Object>();List<Map<String, Object>> mapList = new ArrayList<>();List<Map<String, Object>> nameList = new ArrayList<>();String sql=" SELECT SUM(acq_num_of_people) flows,DATE_FORMAT(acq_time,'%H') AS hours FROM base_three " +"        WHERE DATE(acq_time) = CURDATE() " +"          AND province_id = ? " +"        GROUP BY  DATE_FORMAT(acq_time,'%H')";Connection connection = null;PreparedStatement pStatement = null;connection = getConnection();try {pStatement = connection.prepareStatement(sql);pStatement.setObject(1,proId);ResultSet rs=pStatement.executeQuery();while(rs.next()){map = new HashMap<String,Object>();map.put("value",rs.getInt(1));map.put("name",rs.getString(2));nameList.add(map);}} catch (SQLException throwables) {throwables.printStackTrace();}//return JSONArray.toJSONString(mapList);return nameList;}

开始处理List<Map>结果集:

//根据省份编码获取小时段的客流信息(日客流趋势) basedisanfang的List<Map<String, Object>> disanfangLists = zhiXingMysql.getFlowsHoursDiSanFangByProvince(proId);//根据省份编码获取小时段的客流信息(日客流趋势) basethree的List<Map<String, Object>> threeLists = zhiXingMysql.getFlowsHoursThreeByProvince(proId);Map<Integer, Long> mapTotal = new HashMap<>();//将数据放在map集合中for (Map<String, Object> map : disanfangLists) {mapTotal.put(Integer.parseInt(map.get("name").toString()), Long.parseLong(map.get("value").toString()));}for (Map<String, Object> map : threeLists) {//获取basethree集合中的键int threekey = Integer.parseInt(map.get("name").toString());//获取mapTotal集合中的键,如果有,则相加,如果没有,则直接用Set set = mapTotal.keySet();for (Object hours : set) {//判断三方的里面有没有这个键if (Integer.parseInt(hours.toString()) == threekey) {//有的话,加起来Long flows = Long.parseLong(map.get("value").toString()) + mapTotal.get(threekey);//重新添加到map集合中,替换到原来的mapTotal.put(threekey, flows);}}//获取basethree的所有键Set basethreeSet = map.keySet();Set mapTotalSet = mapTotal.keySet();//遍历一下看看mapTotal里面有没有都加进去Iterator ite1 = mapTotalSet.iterator();Iterator ite2 = basethreeSet.iterator();while (ite2.hasNext()) {if (mapTotalSet.contains(ite2.next())) {mapTotal.put(Integer.parseInt(map.get("name").toString()), Long.parseLong(map.get("value").toString()));}}}Set mapTotalSet = mapTotal.keySet();List<Integer> hourList = new ArrayList<>();;List<Long> flowsList = new ArrayList<>();//将键和值都放在VO中for (Object hours : mapTotalSet) {hourList.add(Integer.parseInt(hours.toString()));flowsList.add(mapTotal.get(hours));}

HomeVO类的字段如下:

/*** @author: muxiongxiong* @date: 2021年11月27日 下午 1:31* 公众号:雄雄的小课堂* 博客:https://blog.csdn.net/qq_34137397* 个人站:http://www.穆雄雄.com* 个人站:http://www.muxiongxiong.cn* @Description: 首页大屏的封装类*/
public class HomeVO {//客流排行private  List<Map<String, Object>> flowOrderByList = new ArrayList<>();//场馆客流占比private  List<Object> flowZhanBiByDept = new ArrayList<>();//月客流趋势private  List<BussFlowList> flowQuShiByMonth = new ArrayList<>();//日客流趋势(暂时没有用)private   Map<Integer, Long> flowQuShiByDays = new HashMap<>();//客流前五的场馆信息private List<Object> flowNameOrderFive = new ArrayList<>();//小时客流趋势的小时private List<Integer> hoursList = new ArrayList<>();//小时客流趋势的客流private List<Long> flowsList = new ArrayList<>();public List<Map<String, Object>> getFlowOrderByList() {return flowOrderByList;}public void setFlowOrderByList(List<Map<String, Object>> flowOrderByList) {this.flowOrderByList = flowOrderByList;}public List<Object> getFlowZhanBiByDept() {return flowZhanBiByDept;}public void setFlowZhanBiByDept(List<Object> flowZhanBiByDept) {this.flowZhanBiByDept = flowZhanBiByDept;}public List<BussFlowList> getFlowQuShiByMonth() {return flowQuShiByMonth;}public void setFlowQuShiByMonth(List<BussFlowList> flowQuShiByMonth) {this.flowQuShiByMonth = flowQuShiByMonth;}public Map<Integer, Long> getFlowQuShiByDays() {return flowQuShiByDays;}public void setFlowQuShiByDays(Map<Integer, Long> flowQuShiByDays) {this.flowQuShiByDays = flowQuShiByDays;}public List<Object> getFlowNameOrderFive() {return flowNameOrderFive;}public void setFlowNameOrderFive(List<Object> flowNameOrderFive) {this.flowNameOrderFive = flowNameOrderFive;}public List<Integer> getHoursList() {return hoursList;}public void setHoursList(List<Integer> hoursList) {this.hoursList = hoursList;}public List<Long> getFlowsList() {return flowsList;}public void setFlowsList(List<Long> flowsList) {this.flowsList = flowsList;}
}

最后是前端封装到echarts中的代码,因为,如果现在是17点的话,则17点之后的数据应该为0才对,所以我这边的思路是先构建一个0-24小时的时间集合,直接扔到面积图的X轴,y轴则是从VO实体类中获取。

这边还会有个问题,就是查询的结果中可能有问题,比如7时没有数据,那么返回的结果就是5 6 8 9 时,没有7时,所以这个地方还需要进行一次与时间遍历判断一下,如果取的时间等于当前X轴的上的某时,才将数据放在Y轴的集合中,否则就填充0。

代码如下:

//根据省份获取每日客流趋势//this.hoursList = null;if (this.hoursList.length === 0) {//构造小时for (let i = 0; i < 24; i++) {this.hoursList.push(i + "时");}}this.hoursFlowList = new Array(24).fill(0);for (var j = 0; j < this.homeVo.hoursList.length; j++) {//获取时间,且格式化一下var shijian = this.homeVo.hoursList[j];for (let i = 0; i < this.hoursFlowList.length; i++) {if (shijian == i) {this.hoursFlowList.splice(shijian, 1, this.homeVo.flowsList[j]);}}}/*这个不能放在括号外面,放外面执行的顺序不一样*/this.drawLines("lines", this.hoursList, this.hoursFlowList);})
},

data中声明的变量如下:

hoursList:[],   //小时的集合hoursFlowList:[], //小时段的客流集合homeVo:[],  //返回的数据结果

好了,到现在为止,已经都实现了,这种方法可能不是最好的方法,大家也可以说出你们的思路~

两个map中的数据,按照相同键,将所对应的值相加方法相关推荐

  1. xlsx表格怎么筛选重复数据_excel怎么筛选两个表中相同数据

    excel使用中,有两个拥有相同数据的工作表,应该怎么筛选出这些数据呢?下面就跟学习啦小编一起来看看吧. excel筛选两个表中相同数据的方法1 在"Sheet1"放上数据一. 在 ...

  2. DB2添加数据时主键、唯一键冲突的解决方法

    DB2添加数据时主键.唯一键冲突的解决方法 参考文章: (1)DB2添加数据时主键.唯一键冲突的解决方法 (2)https://www.cnblogs.com/equation/articles/91 ...

  3. 4.定义并实现一个Person类,包含姓名(name)与编号(code)等两个属性,通过构造函数为属性赋值,拥有显示属性值的方法(showInfo)。从Person类派生出一个Student类,拥有数

    package monster.zf.Test; /*** 4.* 定义并实现一个Person类,包含姓名(name)与编号(code)* 等两个属性,通过构造函数为属性赋值,拥有显示属性值的方法(s ...

  4. java map合并_详解Java8合并两个Map中元素的正确姿势

    1. 介绍 本入门教程将介绍Java8中如何合并两个map. 更具体说来,我们将研究不同的合并方案,包括Map含有重复元素的情况. 2. 初始化 我们定义两个map实例 private static ...

  5. 查询表中id相同的记录mysql_mysql – 从两个表中的ID相同的两个表中选择数据

    好的,我有两个名为subobject的表:parentID,objectName,subID(primary)和subrelation:ID,className parentID | objectNa ...

  6. java 取map中的数据_获取Map集合中数据的方法

    importjava.util.HashMap;importjava.util.Iterator;importjava.util.LinkedHashMap;importjava.util.Map;i ...

  7. vue取通过key取value_如何通过获取map中的key来获得与key对应的value值,进行运算...

    展开全部 获取map的key和value的方法分为以下62616964757a686964616fe4b893e5b19e31333366306439两种形式: 1.map.keySet():先获取m ...

  8. MySQL如何同时删除主外键关联的两张表中的数据

    1. 编写目的 介绍一种方法,解决如下问题:如何同时删除两张相关联的表的记录. 比如说表a的外键fk依赖于表a的id,现在我们需要删除id=5的两条数据. 2. 主要方法 为了简单,推荐更改表a的外键 ...

  9. json vue 出现次数_Vue 如何从两个 JSON 中遍历数据, 根据相同的 Key 为 DOM 赋值?

    现有数据1 shipTypes { "Destroyer": "驅逐艦", "AirCarrier": "航空母艦", ...

最新文章

  1. 格式工厂mac版_格式工厂无广告版,支持PDF文件的转换
  2. python之 启动一个子进程并等待其结束
  3. android 热门开源库,GitHub安卓热门开源资源在项目中的使用及项目总结
  4. 如何把不同尺寸ico格式图标_iConvert Icons——图标创建转换工具
  5. python+selenium+appium遇到的环境问题(已解决)
  6. [Step By Step]SAP HANA PAL多元线性回归预测分析Linear Regression实例FORECASTWITHLR(预测)...
  7. vim 插件之supertab
  8. 自动格式化SQL工具推荐
  9. windows默认共享的打开和关闭
  10. 侯捷C++八部曲笔记(二、STL标准库和泛型编程)
  11. Bootstrap第一章初识
  12. 国外有哪些知名的游戏资讯网站或博客?
  13. 网站被流量攻击了,如何解决
  14. ansible的变量和机密
  15. 安徽电信翼拍照显示服务器异常,人像拍照环境指南
  16. labview 和lin 通讯_LABVIEW几种通讯应用1
  17. 《电子测量与仪器学报》最新投稿经验2022.9
  18. 海龟 (turtle) 画图终极实战:小海龟挑战大迷宫游戏
  19. 地震资料处理Omega2014相关信息汇总
  20. android手机拨号器实现

热门文章

  1. [剑指offer]面试题41:和为s的两个数字VS和为s的连续正数序列
  2. hdu2648 Shopping-map容器
  3. [蓝桥杯]最大连续子序列和
  4. [蓝桥杯2019初赛]数的分解-枚举
  5. Facade(外观)--对象结构型模式
  6. POJ 3159 Candies(差分约束+SPAF)
  7. mysql innodb status_查看innodb的运行状态
  8. Shader 坐标转换
  9. 2021牛客暑期多校训练营4 B - Sample Game 期望dp\生成函数
  10. P3206 [HNOI2010]城市建设