需求 ,将如下类似的list
转换成如下树结构
{
"code":200,
"data":{
"gridName":"全部",
"child":[
{
"id":1,
"gridName":"华东区",
"gridCode":"ss",
"parentId":null,
"child":[
{
"id":3,
"gridName":"浙江省",
"gridCode":null,
"parentId":1
},
{
"id":4,
"gridName":"湖南省",
"gridCode":null,
"parentId":1
}
]
},
{
"id":2,
"gridName":"花呗区",
"gridCode":"bb",
"parentId":null,
"child":[
{
"id":5,
"gridName":"江西省",
"gridCode":null,
"parentId":2
}
]
}
]
},
"message":"成功!"
}
前提条件 :list 的实体类中需要几个必要的属性
public class Region {
/**
* id 字段名 : id
*/
private Long id;
/**
* 区划代码 字段名 : code
*/
private String code;
/**
* 区划名称 字段名 : name
*/
private String name;
/**
* 上级区划id 字段名 : parentRegionId
*/
private Long parentRegionId;
}
首先将list 转成对应的 (id : Map) 的map 方便通过id获取相应节点
List<Region> allRegion = regionMapper.allRegion();
Map<Long, Map<String, Object>> idToRegionMap = new HashMap<>(32);
for (Region region:allRegion) {
idToRegionMap.put(region.getId(),toNode(region));
}
toNode 方法是根据业务提取相应信息转成map 存储节点数据
private Map<String ,Object> toNode(Region region){
Map<String, Object> node = new HashMap<>(8);
node.put("id",region.getId());
node.put("gridCode",region.getCode());
node.put("gridName",region.getName());
node.put("parentId",region.getParentRegionId());
return node;
}
最后是转换树结构的操作 看注释
/**
* 节点list 转成树
* @param idToRegionMap
* @return
*/
private Map<String, Object> toTree(Map<Long, Map<String, Object>> idToRegionMap){
// 根节点
Map<String, Object> rootTree = new HashMap<>(8);
rootTree.put("gridName","全部");
rootTree.put("child",new ArrayList<Map<String, Object>>());
// 遍历,有父节点就和添加到父节点parentNode的child下面,没有父节点就添加到根节点child的下面
for (Map<String, Object> node: idToRegionMap.values()) {
// 添加到父节点的child
if(idToRegionMap.containsKey(node.get("parentId"))){
Map<String, Object> parentNode = idToRegionMap.get(node.get("parentId"));
if(parentNode.containsKey("child")){
List<Map<String, Object>> child = (List<Map<String, Object>>) parentNode.get("child");
child.add(node);
}else {
List<Map<String, Object>> child = new ArrayList<>();
child.add(node);
parentNode.put("child",child);
}
}else {
// 添加到根节点
List<Map<String, Object>> child = (List<Map<String, Object>>) rootTree.get("child");
child.add(node);
}
}
return rootTree;
}