Java双重循环

在实际开发中我们常常遇到这样的问题,有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各有一万条数据那么他只会执行两万次,而不是直接循环的一亿次,天啊这比直接循环的效率高了多少倍!

时间: 2024-10-14 05:27:21

Java双重循环的相关文章

java08双重循环打印图形

public class Double01 { /** * 若有3个班级各4名学员参赛, * 如何计算每个班级参赛学员的平均分? */ public static void main(String[] args) { // 创建一个2维数组保存数据 double[][] scores = new double[3][4]; // 循环输入学员的成绩 Scanner scanner = new Scanner(System.in); // 定义一个变量 保存每个班级的总分 double sum =

JAVA for循环

java for循环就是,对于某些操作,人为地控制循环次数.最简单的,比如打印数字. 举例: 遍历数组 1 2 3 4 int[] a = new int[]{1,2,3,4,5,6,7,8,9,10,11,12};      for(int iloop : a){      System.out.println(iloop); } 2.while结构循环为当型循环(when type loop),一般用于不知道循环次数的情况.维持循环的是一个条件表达式,条件成立执行循环体,条件不成立退出循环.

双重循环趣味题

  今天在做一些双重循环打印的趣味题,在这里分享一下我幼稚的代码: 1 /* 2 * 利用双重循环打印 3 * * 4 * *** 5 * ***** 6 * ******* 7 * ********* 8 * ******* 9 * ***** 10 * *** 11 * * 12 */ 13 14 public class Test { 15 16 public static void main(String[] args) { 17 int num1 = 1; 18 int num2 =

java三大循环----第一次小体会

java三大循环包括while...do while...for (1)语法区别: while循环 while(循环条件){ //循环操作(体) } do  while循环 do{ //循环操作(体) }while(循环条件); for循环 for(初始化;循环条件;迭代){ //循环操作(体) } (2)执行顺序: while循环:先判断后执行 do while循环:先执行后判断 for循环:先判断后执行 (3)适用情况: 循环次数确定的情况,通常选用for循环: 循环次数不确定的情况,通常选

[java基础]循环结构1

[java基础]循环结构1 循环结构:for循环,while循环,do_while循环在,增强型for循环 /** 文件路径:G:\JavaByHands\循环语句文件名称:WhileTest.java 编写时间:2016/6/7 作 者:郑晨辉 编写说明:while do while 代码示例 */ public class WhileTest{ public static void main(String[] args){ //初始条件 int i = 0; //进入循环,while循环先判

[Java基础]循环结构3

[Java基础]循环结构3 break 与 continue 中断循环... 1 /** 2 文件路径:G:\JavaByHands\循环语句 3 文件名称:BreakTest.java 4 编写时间:2016/6/12 5 作 者:郑晨辉 6 编写说明:break 结束循环 7 break 是完全跳出循环~~也就是说,遇到break 循环终止~~ 8 */ 9 10 public class BreakTest{ 11 12 public static void main(String[] a

汇编入门学习笔记 (六)—— si、di,双重循环

疯狂的暑假学习之  汇编入门学习笔记 (六)-- si.di,双重循环 参考: <汇编语言> 王爽 第7章 1. and和or指令,与[bx+idata] and和or,就不多说了. [bx+idata] 这样写是可以的,某些情况下,比较方便. [bx+idata] 也可以写成 idata[bx] 直接见例子: 把'ABcde' 跟 'fGHig' 都改成大写(ASCII中大写字母与小写字母二进制中,只有第五位不同,大写字母是0,小写字母是1) assume cs:code,ds:data d

[java基础]循环结构2

[java基础]循环结构2 写了几个循环结构练习~记录一下~~ 1:99乘法表 1 /** 2 文件路径:G:\JavaByHands\循环语句 3 文件名称:GameForFor.java 4 编写时间:2016/6/7 5 作 者:郑晨辉 6 编写说明:for循环示例 代码示例 7 编写一个99乘法表 8 */ 9 public class GameForFor { 10 public static void main(String[] args) { 11 //目标:输出99乘法表 12

Java中循环声明变量方法

Java循环声明变量 之前想这样做,但是网上一直搜索不到,下面是我的方式 项目中 // 得到需要查询外表的数量,然后分别创建缓存,插入数据多的时候如果编码在缓存里面,就不需要再去查询数据库了.key:code/value:pk // 根据"数据来源"有多少非空的 就创建几个,使用 "数据来源字段"+Cache 当cacheMap的key Map<String, Map<String, String>> cacheMap =new HashMa