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