最近在写Map递归,然后发现每个树节点的map的值都是一样的,然后一次一次debug,最后发现map的传递性导致的,就像下面一样
Map<String, String> srcMap = new HashMap<>();
srcMap.put("a","a");
Map<String, String> addMap2 = srcMap;
Map<String, String> removeMap2 = srcMap;
addMap2.put("b","b");
removeMap2.put("c","c");
System.out.println(srcMap);
System.out.println(addMap2);
System.out.println(removeMap2);
//{a=a, b=b, c=c}
//{a=a, b=b, c=c}
//{a=a, b=b, c=c}
如果想要使MAP不引用传递,使用以下写法复制新new出来的map
Map<String, String> srcMap = new HashMap<>();
srcMap.put("a","a");
Map<String, String> addMap22 = new HashMap<>(srcMap);
Map<String, String> removeMap22 = new HashMap<>(srcMap);;
addMap22.put("b","b");
removeMap22.put("c","c");
System.out.println(srcMap);
System.out.println(addMap22);
System.out.println(removeMap22);
//{a=a}
//{a=a, b=b}
//{a=a, c=c}
记录下自己的map递归
package TestMessage;
import com.aadata.datacenter.dataManage.utils.tree.TreeUtil;
import com.google.gson.Gson;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class test015 {
private static Gson gson = new Gson();
public static void main(String[] args) throws Exception {
List<TableMappingModel> list = new ArrayList<>();
TableMappingModel tableMappingModel1 = new TableMappingModel("1","0","name",1,"","fix","tablename","colname",null,null);
TableMappingModel tableMappingModel2 = new TableMappingModel("2","1","name2",1,"","fix","tablename2","colname2",null,null);
TableMappingModel tableMappingModel3 = new TableMappingModel("3","1","name3",1,"","fix","tablename2","colname3",null,null);
TableMappingModel tableMappingModel4 = new TableMappingModel("4","3","name4",1,"","fix","tablename2","colname4",null,null);
TableMappingModel tableMappingModel5 = new TableMappingModel("5","3","name5",1,"","fix","tablename2","colname5",null,null);
TableMappingModel tableMappingModel7 = new TableMappingModel("7","5","name7",1,"","fix","tablename2","colname7",null,null);
TableMappingModel tableMappingModel8 = new TableMappingModel("8","7","name8",1,"","fix","tablename2","colname8",null,null);
TableMappingModel tableMappingModel9 = new TableMappingModel("9","7","name9",1,"","fix","tablename2","colname9",null,null);
list.add(tableMappingModel1);
list.add(tableMappingModel2);
list.add(tableMappingModel3);
list.add(tableMappingModel4);
list.add(tableMappingModel5);
list.add(tableMappingModel7);
list.add(tableMappingModel8);
list.add(tableMappingModel9);
TreeUtil treeUtil = new TreeUtil();
List<TableMappingModel> list1 = treeUtil.toTree(list);
String s = gson.toJson(list1);
System.out.println(s);
Map mapHashMap = new HashMap<>();
Map<String,Object> map = new HashMap<>();
map.put("colname2","name2-1");
map.put("colname3","name3-1");
Map<String,Object> map1 = new HashMap<>();
map1.put("colname4","name4-3");
map1.put("colname5","name5-3");
Map<String,Object> map3 = new HashMap<>();
map3.put("colname7","name7-5");
Map<String,Object> map4 = new HashMap<>();
map4.put("colname8","name8-7");
map4.put("colname9","name9-7");
mapHashMap.put("1",map);
mapHashMap.put("3",map1);
mapHashMap.put("5",map3);
mapHashMap.put("7",map4);
Map dataModels = new HashMap();
TableMappingModel tableMappingModel = list1.get(0);
dataModels.put("root","根节点");
List<TableMappingModel> tableMappingModelList1 = list1.get(0).getTableMappingModelList();
commonMeth(mapHashMap, dataModels, tableMappingModelList1);
System.out.println("zong:;;;"+dataModels);
}
private static void commonMeth(Map mapHashMap, Map dataModels, List<TableMappingModel> tableMappingModelList1) {
for(TableMappingModel one:tableMappingModelList1 ){
Map mapEntity = new HashMap<>((Map) mapHashMap.get(one.getPid()));
if(!CollectionUtils.isEmpty(one.getTableMappingModelList())){
// 等于1表示是对象类型
// mapEntity = (Map) mapHashMap.get(one.getPid());
List<TableMappingModel> childtableMappingModelList = one.getTableMappingModelList();
commonMeth(mapHashMap,mapEntity,childtableMappingModelList);
dataModels.put(one.getName(),mapEntity);
}else{
dataModels.put(one.getName(),mapEntity);
}
}
System.out.println("0:"+dataModels);
}
private static void commonMeth_n(Map mapHashMap, Map dataModels, List<TableMappingModel> tableMappingModelList1) {
for(TableMappingModel one:tableMappingModelList1 ){
if(one.getType() == 2){
// 等于2 表示是集合类型,list非结构话数据无法再往下拼装子类(因为不知道把子类拼装到这个list的那个实体类中)
List<Map> listmap = new ArrayList<>();
List<Map> o = (List<Map>) mapHashMap.get(one.getPid());
listmap.addAll(o);
dataModels.put(one.getName(),listmap);
}else{
Map mapEntity = new HashMap<>((Map) mapHashMap.get(one.getPid()));
if(!CollectionUtils.isEmpty(one.getTableMappingModelList())){
// 等于1表示是对象类型
mapEntity = (Map) mapHashMap.get(one.getPid());
List<TableMappingModel> childtableMappingModelList = one.getTableMappingModelList();
commonMeth(mapHashMap,mapEntity,childtableMappingModelList);
dataModels.put(one.getName(),mapEntity);
}else{
dataModels.put(one.getName(),mapEntity);
}
}
}
}
}
实体类
package TestMessage;
import com.aadata.datacenter.dataManage.utils.tree.TreeId;
import com.aadata.datacenter.dataManage.utils.tree.TreeParent;
import com.aadata.datacenter.dataManage.utils.tree.TreeSub;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TableMappingModel {
@TreeId
private String id;
/**
* 父id
*/
@TreeParent
private String pid;
private String name;
private int type;
private String appear;
private String fix;
private String tableName;
private String colName;
private String docBusiId;
@TreeSub
List<TableMappingModel> tableMappingModelList;
}