在實際開發中我們常常遇到這樣的問題,有A、B兩個集合,這兩個集合的某一個字段是相同的,要把A集合和B進行匹配,然后把A的值賦值給B例如:
//上傳圖片
List<MultipartFile> A=multipartRequest.getFiles("fileName");
List<MultipartFile> C=new ArrayList<MultipartFile>();
List<TQuestionInfo> B=questionInfoService.getTaskList(taskUser.getTaskCode());
for (TQuestionInfo q :B) {
for (MultipartFile t : A) {
if(q.getQuestionNum().equals(t.getOriginalFilename())){
C.add(t);
}
q.setTTaskQuestionUserPic(C);
}
這樣是對但是這樣處理有個很嚴重的問題,這樣循環是N*N的,意思是如果A有一萬條數據B有一萬條數據那么這個循環會循環一億次,如果A和B各有十萬條數據那結果我就不敢想象。
對於這樣的情況我選擇了封裝一個集合,比如說把A集合封裝為Map <String,<MultipartFile>> 然后循環B集合 用相同的字段當做鍵值來取例如:
//封裝為Map
public Map<String,List<TTaskQuestionUserPic>> getTaskQuetionUserMapPic(List<TTaskQuestionUserPic> list){
Map<String,List<TTaskQuestionUserPic>> map = new HashMap<String, List<TTaskQuestionUserPic>>();
List<TTaskQuestionUserPic> childList=null;
Iterator<TTaskQuestionUserPic> it=list.iterator();
TTaskQuestionUserPic info =null;
while(it.hasNext()){
info=it.next();
childList=map.get(info.getTaskQuestionUserCode());
if(childList==null){
childList=new ArrayList<TTaskQuestionUserPic>();
map.put(info.getTaskQuestionUserCode(),childList);
}
childList.add(info);
}
return map;
}
//從Map里面取出值
for (TTaskQuestionUser q : questionUserList) {
List<TTaskQuestionUserPic> list= map.get(q.getTaskQuestionUserCode());
if(EmptyUtils.isNotEmpty(list))
q.setPicList(list);
TQuestionInfo questionInfo=getQuestionMap.get(q.getQuestionNum());
q.setStem(questionInfo.getStem());
q.setQuestionAnalyze(questionInfo.getQuestionAnalyze());
}
taskUser.setQuestionUserList(questionUserList);
這樣做看似很繁瑣但是最重要的一點它的執行的效率比直接循環兩個集合的提高了很多很多。因為這樣處理它只是循環兩個集合就是說A和B各有一萬條數據那么他只會執行兩萬次,而不是直接循環的一億次,天啊這比直接循環的效率高了多少倍!