试想这样一个场景: 数据库表中 有 城市信息表 city_tbl; 有院士信息表  ys_tbl ,其中院士有城市id字段(id); 但是不是所有城市都有院士;

我们想要得到 城市的详细信息,包括院士个数且这些信息展现在同一张列表里面;

方法一: 查询城市列表,然后在 依次发送sql 到 院士信息表 做相关统计,这是比较low 的做法。。就sql 数据库而言,如果城市是400个的话,那么查询时间 大约1分钟;

方法二: 查询城市列表; 用 select id as ID , count(1)  as NUM 【不要用count(*) 】 from ys_tbl group by id 做分组统计; 这样一来就可以得到 两个 List<Map<String, Object>> ;剩下的处理流程如 下面的源码所示。。

这样处理的好处是,一、减少操作数据库的次数;二、 不需要做额外的查找操作除了 HashMap用到的 Hash查找算法外;这种效率非常高。

【源码】

/*** 两个map的融合* @author Tang Rong* @date 2017年9月23日*/
public class MapMergeTest {public static void main(String[] args) {List<Map<String, Object>> cityList = new ArrayList<>();String[] cities = new String[]{"北京", "上海", "广州", "深圳", "成都"};;for (int i = 0; i < cities.length; i++) {Map<String, Object> map = new HashMap<>();map.put("ID", i);map.put("NAME", cities[i]);map.put("DESC", "描述" + i);cityList.add(map);}List<Map<String, Object>> numList = new ArrayList<>();/* 比如院士仅统计了上海,广州,深圳(模拟数据) */int[] nums = new int[]{6, 9, 8};for (int i = 1; i < nums.length+1; i++) {Map<String, Object> map = new HashMap<>();map.put("ID", i);map.put("NUM", nums[i-1]);numList.add(map);}List<Map<String, Object>> result = fillNum(cityList, numList);for (Map<String, Object> m : result) {Iterator<String> it = m.keySet().iterator();while (it.hasNext()) {String key = it.next();System.out.print("[" + key +"] = " + m.get(key) + ", ");}System.out.println();}}// 填充一个map的人口数量到另外一个map(通过hash查找) public static List<Map<String, Object>> fillNum(List<Map<String, Object>> cityList, List<Map<String, Object>> numList) {List<Map<String, Object>> result = null;Map<String, Map<String, Object>> struct = new HashMap<>();/* 把 posList 拆解 到 Map容器中 */for (Map<String, Object> map : cityList) {struct.put(map.get("ID").toString(), map);}/* 对 numList 进行拆解 */for (Map<String, Object> map : numList) {String rcrd_id = map.get("ID").toString();Map<String, Object> posMap = struct.get(rcrd_id);posMap.putAll(map);}return new ArrayList<Map<String, Object>>(struct.values());}
}

【运行结果】

[ID] = 0, [DESC] = 描述0, [NAME] = 北京,
[NUM] = 6, [ID] = 1, [DESC] = 描述1, [NAME] = 上海,
[NUM] = 9, [ID] = 2, [DESC] = 描述2, [NAME] = 广州,
[NUM] = 8, [ID] = 3, [DESC] = 描述3, [NAME] = 深圳,
[ID] = 4, [DESC] = 描述4, [NAME] = 成都,

java中两个map的融合(两个map有相同字段)相关推荐

  1. Java中double类型输出小数点后两位

    Java中double类型输出小数点后两位 思路 就是在输出的时候使用字符串格式即可. double testNum=1.123456789;System.out.println(String.for ...

  2. 猿创征文|Java中的IO流大家族 (两万字详解)

    目录 IO流 概述 分类 四大家族 需要掌握的16个流 文件专属 FileInputstream(读 字节) FileInputStream类的其他常用方法 FileOutputStream (写 字 ...

  3. 中文乱码在java中URLEncoder.encode方法要调用两次解决

    2019独角兽企业重金招聘Python工程师标准>>> 因为在jsp中对中文进行了编码的时候用的是UTF-8的编码方式,而在servlet中调用request.getParamete ...

  4. Java中BorderLayout布局管理器的两种排列实现方式

    java中Frame类默认的布局管理器为BorderLayout,其主要是将Frame窗口分为东西南北中五个区域,每个区域仅限于放一个组件,如加入多个,前免得会被覆盖,解决方法为:可以在一个区域中加入 ...

  5. Java中如何通过经纬度坐标获取两个点之间的直线距离

    前言 现在很多App都需要附带着附近人列表功能,所以我在这里实现2个点之间的距离计算 经纬度的获取需要第三方来支持,高德地图.百度地图.... 附近人功能具体的实现逻辑: 1.获取每个人的经纬度坐标, ...

  6. Java中对List集合排序的两种方法

    第一种方法,就是list中对象实现Comparable接口,代码如下: public class Person implements Comparable<Person> {private ...

  7. Java中如何不用中间变量来使两个变量交换值

    当我们在让两个变量的值进行交换时常常要用到第三个临时变量 例如下面我们想让变量a和b的值进行互换,我们的代码如下: int a = 5; int b = 6; int c; // 进行交换值操作 c ...

  8. java中取值保留小数点后两位的四种方法

    方法: 用format方法,语法"String.format("%.2f",数值)" 用DecimalFormat的format方法 用setScale方法进行 ...

  9. java代码二进制转为十六进制_Java 中二进制转换成十六进制的两种实现方法

    Java 中二进制转换成十六进制的两种实现方法 每个字节转成16进制,方法1 /** * 每个字节转成16进制,方法1 * * @param result */ private static Stri ...

  10. java语言的多态性及特点_Java中的方法的多态性有两种形式:( )和( )。_学小易找答案...

    [填空题]已知函数 ,则微分 . [填空题]. [单选题]71.用转动小滑板法车圆锥时产生( )误差的原因是小滑板转动角度计算错误. [单选题] [填空题]Java中的方法的多态性有两种形式:( )和 ...

最新文章

  1. MPB:基于BIOLOG的微生物群落功能分析
  2. MySQL 高级 - 存储过程 - 函数
  3. python 拼多多_拼多多现重大BUG被“薅羊毛”,教你如何用Python简单褥羊毛
  4. windows获取系统补丁+匿名管道
  5. Google:2-1 tfkeras简介
  6. 线程与进程的区别及其通信方式
  7. Atitit 单点登录实现几种模式架构图 目录 1. 因此要点也就以下两个:存储信任验证信任 1 1.1. 共享cookie (最简单 1 1.2. 通过 url带token参数跳转 1 1.3.
  8. 【工具篇】---UniWebView插件的使用Unity内部打开Web网页<二>
  9. 【PS】制作透明质感按钮
  10. 一个标准的k-means(误差平方和版本)
  11. VisualSVN 用户权限设置时,Everyone,Group,User优先级组合原则(与 Subversion 对比)...
  12. iOS开发 frame与bounds
  13. 三位数码管电路设计实验
  14. AWash: Handwashing Assistance for the Elderly with Dementia via Wearables
  15. 【JZOJ A组】【NOIP2019模拟】最短路(tiring)
  16. 华东师范大学计算机模拟试题,华东师范大学计算机机试真题
  17. 名帖300 王铎 行书《行书帖选》
  18. 【Hack The Box】linux练习-- Tabby
  19. 使用mp4v2将H264+AAC合成mp4文件
  20. 去掉高德地图左下角的logo和文字

热门文章

  1. [NOI2009] 变换序列 (匈牙利最大匹配)
  2. jzoj3188-找数【质数筛,数论】
  3. P2947-[USACO09MAR]向右看齐Look Up【单调栈】
  4. 【DP】数字游戏(jzoj 2131)
  5. csp初赛复习(往年真题+解析)
  6. I - Trade Gym - 100212I 网络流
  7. Hadoop的FileSystem.copyToLocalFile两个参数 空指针异常
  8. 面试中经常会问的智力题,来看看你会做几道
  9. MySQL dayofweek()函数
  10. 一篇文章彻底了解清楚什么是负载均衡