java中兩個map的融合(兩個map有相同欄位)
阿新 • • 發佈:2019-02-01
試想這樣一個場景: 資料庫表中 有 城市資訊表 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] = 成都,