试想这样一个场景: 数据库表中 有 城市信息表 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] = 成都,