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

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



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值