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

7a6f8d98a71a261a993cf0737440b2b6.png

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

前言

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

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

效果如下:

535019de415ff4e7540ef8de24f6b0c9.png


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

思路分析

  • 分别按照小时分组查询两个表中的数据,查询出来的结构是一个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:[],  //返回的数据结果

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

publiccms中将推荐页的内容显示在页面片段中

遍历的代码如下&#xff1a; <#list page.list><ul><#items as a><li><figure><!-- ${a.itemType!} : ${a.itemId!} ,place/redirect:count and 301 jump to a.url,place/click:count and 302 jump to a.url--><a href"${site.dyn…

ASP.NET Core 运行原理解剖[3]:Middleware-请求管道的构成

在 ASP.NET 中&#xff0c;我们知道&#xff0c;它有一个面向切面的请求管道&#xff0c;有19个主要的事件构成&#xff0c;能够让我们进行灵活的扩展。通常是在 web.config 中通过注册 HttpModule 来实现对请求管道事件监听&#xff0c;并通过 HttpHandler 进入到我们的应用程…

publiccms实现首页菜单栏下拉的方法

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 今天接到了个需求&#xff0c;使用publiccms实现首页导航栏下拉的效果&#xff0c;效果如下&#xff1a; 目前我的思路如下&#xff1a; 采用分类的方法实现将左侧的项作为二级分类右边…

2017(深圳) .NET技术分享交流会(第二期)网络直播活动

.NET Core 2.0 已于2017年8月14日正式发布&#xff0c;2017(深圳) .NET技术分享交流会在公众号中发出2个小时后就被抢光了&#xff0c;受限于场地无法增加人数&#xff0c;这次如鹏网杨中科老师提供VIP级的网络直播支持&#xff0c;为了保证网络直播效果&#xff0c;另外开启网…

publiccms实现多层级选项卡效果

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 距离上次更新已经好久了~最近心有余而力不足。。 最近在学习freammarker标签&#xff0c;算是比较老的技术了&#xff0c;白天写&#xff0c;晚上做梦都在写&#xff0c;不吐槽了&am…

“雪花”项目:Microsoft探索在.NET中实现手工内存管理

来自Microsoft研究院、剑桥大学和普林斯顿大学的一些研究人员构建了一个.NET的分支&#xff0c;实现了在运行时中添加支持手工内存管理的API。研究方法的细节及所获得的性能提升发表在名为“Project Snowflake: Non-blocking Safe Manual Memory Management in .NET”&#xff…

publiccms按照指定显示的日期格式,格式化日期的写法

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 现在是2021年12月30日20:21:37&#xff0c;距离2021年结束仅仅不到2天的时间了&#xff0c;时间恍如白驹过隙&#xff01; 今天还是搞的publiccms,分享个简单的语法吧&#xff1a;在…

Orleans解决并发之痛(四):Streams

Orleans 提供了 Stream扩展编程模型。此模型提供了一套API&#xff0c;使处理流更简单和更健壮。Stream默认提供了两种Provider&#xff0c;不同的流类型可能使用不同的Provider来处理&#xff0c;Simple Message Stream Provider 和 Azure Queue Stream Provider。Stream Prov…

如何编写更好的SQL查询:终极指南-第二部分

上一篇文章《如何编写更好的SQL查询&#xff1a;终极指南-第一部分》中&#xff0c;我们学习了 SQL 查询是如何执行的以及在编写 SQL 查询语句时需要注意的地方。 下面&#xff0c;我进一步学习查询方法以及查询优化。 基于集合和程序的方法进行查询 反向模型中隐含的事实是…

publiccms实现遍历多级分类下的不同样式内容

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 现在是2022年1月2日17:06:51,假期这两天都在做publiccms。 上篇文章遗留的问题&#xff0c;最终还是没有按照富文本去做&#xff0c;后期在看吧&#xff1b; 今天遇到了个问题&…

四张图带你了解Tomcat系统架构--让面试官颤抖的Tomcat回答系列

转载自 四张图带你了解Tomcat系统架构--让面试官颤抖的Tomcat回答系列 俗话说&#xff0c;站在巨人的肩膀上看世界&#xff0c;一般学习的时候也是先总览一下整体&#xff0c;然后逐个部分个个击破&#xff0c;最后形成思路&#xff0c;了解具体细节&#xff0c;Tomcat的结构…

.NET Core 2.0应用程序大小减少50%

.NET Core 2.0应用程序减小体积瘦身官方工具 IL Linker。 IL Linker 来源于mono的linker https://github.com/mono/linker&#xff0c;目前还是预览版本。 在一般的情况下&#xff0c;链接器可以将应用程序的大小减少50&#xff05;&#xff0c;大型应用程序的大小可能更有利…

Orleans解决并发之痛(五):Web API

通过前面几篇文章的介绍&#xff0c;可能会疑问怎么在实际开发中调用Grain&#xff0c;之前Demo的Client都是基于控制台应用程序&#xff0c;实际开发下可能是基于Web Form、Web API、MVC......&#xff0c;由于一时短路了&#xff0c;没有联想到控制台应用程序的方式怎么切到其…

ASP.Net Core WebApi几种版本控制对比

一、版本控制的好处&#xff1a; &#xff08;1&#xff09;有助于及时推出功能, 而不会破坏现有系统。 &#xff08;2&#xff09;它还可以帮助为选定的客户提供额外的功能。 API 版本控制可以采用不同的方式进行控制&#xff0c;方法如下&#xff1a; &#xff08;1&…

asp.net core策略授权

在《asp.net core认证与授权》中讲解了固定和自定义角色授权系统权限&#xff0c;其实我们还可以通过其他方式来授权&#xff0c;比如可以通过角色组&#xff0c;用户名&#xff0c;生日等&#xff0c;但这些主要取决于ClaimTypes&#xff0c;其实我们也可以自定义键值来授权&a…

Safari浏览器不支持let声明的解决方式

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 现在是2022年1月7日16:19:38,前几天用publiccms改了个网站&#xff0c;因为客户那边各种机型都有&#xff08;各PC端的分辨率也都不一样&#xff09;&#xff0c;所以导致页面呈现的效…

Executor 与 ExecutorService 和 Executors 傻傻分不清

转载自 Executor 与 ExecutorService 和 Executors 傻傻分不清 java.util.concurrent.Executor, java.util.concurrent.ExecutorService, java.util.concurrent. Executors 这三者均是 Java Executor 框架的一部分&#xff0c;用来提供线程池的功能。因为创建和管理线程非常心…

ASP.NET Core 2.0 自定义 _ViewStart 和 _ViewImports 的目录位置

在 ASP.NET Core 里扩展 Razor 查找视图目录不是什么新鲜和困难的事情&#xff0c;但 _ViewStart 和 _ViewImports 这2个视图比较特殊&#xff0c;如果想让 Razor 在我们指定的目录中查找它们&#xff0c;则需要耗费一点额外的精力。本文将提供一种方法做到这一点。注意&#x…

Safari浏览器不支持……

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂前言现在是2022年1月7日16:19:38,前几天用publiccms改了个网站&#xff0c;因为客户那边各种机型都有&#xff08;各PC端的分辨率也都不一样&#xff09;&#xff0c;所以导致页面呈现的效果…

开源分享 Unity3d客户端与C#分布式服务端游戏框架

很久之前&#xff0c;在博客园写了一篇文章&#xff0c;《分布式网游server的一些想法语言和平台的选择》&#xff0c;当时就有了用C#做网游服务端的想法。写了个Unity3d客户端分布式服务端框架&#xff0c;最近发布了1.0版本&#xff0c;取名ET框架。ET框架的目标就是简化客户…