java 大數據比較兩個list集合的差值


有這么個場景,每天需要定時任務插入增量數據。如果通過接口獲取的直接根據時間過濾,那么就能直接就可以插入庫中。但有時獲取到的並不是增量數據,比如微信公眾號獲取關注者列表時,獲取到的是全量數據,這樣每天就得將全量數據與庫中進行比較,只有庫中不存在數據才進行插入。這就有了兩個list比較差值的問題。

以前在處理該問題時,會遍歷全量中的list,然后判斷每個對象是否已在數中存在,如果不存在就放到一個臨時List中,最后返回的臨時List就是增量數據了,代碼如下:

private List<String> getNeedAddOpenidList(List<String> allOpenidList, List<String> dbOpenidList) {
	    if (dbOpenidList != null && !dbOpenidList.isEmpty()) {
	    	List<String> resultList = new ArrayList<String>();
	    	
	    	if (allOpenidList != null && !allOpenidList.isEmpty()) {
	    		for (String openid : allOpenidList) {
		    		if (!dbOpenidList.contains(openid)) {
		    			resultList.add(openid);
		    		}
		    	}
	    	}
	    	return resultList;
	    } else {
	    	return allOpenidList;
	    }
    }

但這種在處理幾千條數據還好,等上萬、或上十萬時,執行效率就會很低。即便我后來用list1.removeAll(list2)時,在處理40萬條數據時,10分鍾根本處理不完。

后來用如下方法,瞬間完成:

private List<String> getNeedAddOpenidList(List<String> allOpenidList, List<String> dbOpenidList) {
	    if (dbOpenidList != null && !dbOpenidList.isEmpty()) {
	    	Map<String, String> dataMap = new HashMap<String, String>();
			for (String id : dbOpenidList) {
				dataMap.put(id, id);
			}
			
			List<String> newList = new ArrayList<String>();
			for (String id : allOpenidList) {
				if (!dataMap.containsKey(id)) {
					newList.add(id);
				}
			}
			return newList;
	    } else {
	    	return allOpenidList;
	    }
    }

1.將數據庫中的list轉成一個map集合

2.遍歷獲取到的全量數據,通過主鍵或唯一索引之類的字段進行比較

3.如果map.get(key)不存在,放到一個臨時List中

4.最后將臨時List返回

如果以后有更高效率的方法,還會進行更新


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM