双层循环因为漏掉break带来的数据重复问题

先看原先的代码:id相同则修改,没有Id则添加:

  if(null!=ysbMaterialList && !ysbMaterialList.isEmpty()){
			for(MiddleTempMaterial ysbMaterial : ysbMaterialList){
				String ysbSpid = ysbMaterial.getSpid();
				if(null!=tempMaterialList && !tempMaterialList.isEmpty()){
					for(MiddleTempMaterial tempMaterial : tempMaterialList){
						String tempSpid = tempMaterial.getSpid();
						if(ysbSpid.equals(tempSpid)){
							updateMaterialList.add(ysbMaterial);
						}else{
							insertMaterialList.add(ysbMaterial);
						}
					}	
				}else{
					insertMaterialList.add(ysbMaterial);
				}
			}
		}
		insertEntityMap.put("1", insertMaterialList);
		updateEntityMap.put("1", updateMaterialList);
当时没有看出有什么问题,运行时才发现有大量的数据重复问题,经过分析发现上边的代码片段与业务逻辑不符,因为我漏掉了break的使用,仔细分析发现第二层循环会持续的向某个List中添加数据,因为第一层循环的数据和第二层的每一条都比较,第二层循环有多少条循环就会插入多少次,必然会导致数据大量重复,解决办法就是立一个flag,拿出第一层循环的某个数据与二层循环的每一条数据比较如果匹配上则修改flag的状态,并用break跳出本层循环比较,因为此时已经获得了数据,不必进行第二层的后续循环,取第一层的下一条数据进行下一次循环,没有匹配上的则不修改flag,这样到最后就可以用判断flag的方式来确定二层循环中有没有匹配上,并对第一层循环的数据进行分类

修改后的代码片段为:

if(null!=ysbMaterialList && !ysbMaterialList.isEmpty()){
			for(MiddleTempMaterial ysbMaterial : ysbMaterialList){
				String ysbSpid = ysbMaterial.getSpid();
				if(null!=tempMaterialList && !tempMaterialList.isEmpty()){
					boolean flag=false;
					Integer state=1;
					for(MiddleTempMaterial tempMaterial : tempMaterialList){
						String tempSpid = tempMaterial.getSpid();
						if(ysbSpid.trim().equals(tempSpid.trim())){
							flag=true;
							state=tempMaterial.getState();
							break;
						}
					}
					if(flag){
						ysbMaterial.setState(state);
						updateMaterialList.add(ysbMaterial);
					}else{
						insertMaterialList.add(ysbMaterial);
					}
				}else{
					insertMaterialList.add(ysbMaterial);
				}
			}
		}
		insertEntityMap.put("1", insertMaterialList);
		updateEntityMap.put("1", updateMaterialList);

所以在循环的时候要想好逻辑,避免这样的错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值