您的位置:首页 > 编程语言 > Java开发

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

2016-09-14 16:33 288 查看
先看原先的代码: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);
所以在循环的时候要想好逻辑,避免这样的错误
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java