1. 程式人生 > >java中兩個map的融合(兩個map有相同欄位)

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] = 成都,