需求 ,將如下類似的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;
}