java返回树结构数据

方法1、

SELECT
	si.id,
	si.pid,
	si.last_level_name lastLevelName
FROM
	tf_store_info si
id     pid    name
2122	0	**有限公司
2123	2122	hx
2133	2122	测试2
2134	2133	测试3
2135	2133	测试4
2136	2135	测试5
2137	2135	测试6
以上sql是查 list数据

setStoreTreeList(0,list,treeList);

/**
     * 默认父级id为0的树形数据
     */
    private void setStoreTreeList(Integer parentId, List<Map<String,Object>> list, List<Map<String,Object>> treeList) {
        for (Map<String,Object> map : list) {
            if(map.get("pid")!=null){
                Integer rcsParentId = Integer.parseInt(String.valueOf(map.get("pid")));
                if(parentId.equals(rcsParentId)){
                    treeList.add(map);
                    Integer id = Integer.parseInt(String.valueOf(map.get("id")));
                    if (list.stream().filter(r ->r.get("pid")!=null && r.get("pid").equals(id.toString())).findAny() !=null){
                        List<Map<String, Object>> childList = new ArrayList<>();
                        map.put("child",childList);
                        setStoreTreeList(id,list,childList);
                    }
                }
            }
        }
    }

  

方法2、

一、创建一个实体类

package com.example.demo.evt;

import lombok.Data;

import java.util.List;
@Data
public class UserTree {
    private String id;
    private String label;
    private String sort;
    private String pid;
    private List<UserTree> child;

    public UserTree(String id, String label, String sort, String pid, List<UserTree> child) {
        this.id = id;
        this.label = label;
        this.sort = sort;
        this.pid = pid;
        this.child = child;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public String getSort() {
        return sort;
    }

    public void setSort(String sort) {
        this.sort = sort;
    }

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public List<UserTree> getChild() {
        return child;
    }

    public void setChild(List<UserTree> child) {
        this.child = child;
    }
}

二、创建一个util类

package com.example.demo.utils;

import com.example.demo.evt.UserTree;
import org.assertj.core.util.Lists;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TreeToolUtils {
    private List<UserTree> rootList; //根节点对象存放到这里

    private List<UserTree> bodyList; //其他节点存放到这里,可以包含根节点

    public TreeToolUtils(List<UserTree> rootList, List<UserTree> bodyList) {
        this.rootList = rootList;
        this.bodyList = bodyList;
    }

    public List<UserTree> getTree(){   //调用的方法入口
        if(bodyList != null && !bodyList.isEmpty()){
            //声明一个map,用来过滤已操作过的数据
//            Map<String,String> map = Maps.newHashMapWithExpectedSize(bodyList.size());
            Map<String,String> map = new HashMap<>();
                    rootList.forEach(beanTree -> getChild(beanTree,map));
            return rootList;
        }
        return null;
    }

    public void getChild(UserTree treeDto,Map<String,String> map){
        List<UserTree> childList = Lists.newArrayList();
        bodyList.stream()
                .filter(c -> !map.containsKey(c.getId()))
                .filter(c ->c.getPid().equals(treeDto.getId()))
                .forEach(c ->{
                    map.put(c.getId(),c.getPid());
                    getChild(c,map);
                    childList.add(c);
                });
        treeDto.setChild(childList);

    }


}

三、main 测试

public static void main(String[] args) {
     // id, label, sort, pid, List<UserTree> 可以是返回的数据,然后遍历add到数组中 UserTree treeDto
= new UserTree("1", "北京", "null", "true",null); UserTree treeDto1 = new UserTree("2", "三环", "null", "1",null); UserTree treeDto2 = new UserTree("3", "故宫", "null", "1",null); UserTree treeDto3 = new UserTree("710", "陈静", "null", "2",null); UserTree treeDto4= new UserTree("713", "秀秀", "null", "2",null); ArrayList<UserTree> rootList = new ArrayList<>();//根节点 ArrayList<UserTree> bodyList = new ArrayList<>();//子节点 rootList.add(treeDto); bodyList.add(treeDto1); bodyList.add(treeDto2); bodyList.add(treeDto3); bodyList.add(treeDto4); System.out.println(bodyList.get(1)); TreeToolUtils utils = new TreeToolUtils(rootList,bodyList); List<UserTree> result = utils.getTree(); String jsonString = JSONObject.toJSONString(result.get(0)); System.out.println(jsonString); }

 如果是serviceImpl返回的数据

try {

            logger.log(MyLogUtil.LOG_INFO,"获取配置");
            List<Map<String,Object>> list = precisePushMapper.queryCommitConfigOne();
            List<Map<String,Object>> resultList = new ArrayList<>();
            // 转为树结构为前端使用
            if(list.size() > 0){
                ArrayList<ConfigTree> rootList = new ArrayList<>();//根节点
                ArrayList<ConfigTree> bodyList = new ArrayList<>();//子节点
                for(int i=0;i<list.size();i++){
                    String configId = list.get(i).get("configId").toString();
                    String configName = list.get(i).get("configName").toString();
                    String pid = list.get(i).get("pid").toString();
                    ConfigTree tree = new ConfigTree(configId,configName,pid,null);
                    if(pid.equals("true") || pid == "" || pid == null){ // 说明是根节点
                        rootList.add(tree);
                    }else {
                        bodyList.add(tree);
                    }
                }
                ConfigTreeUtil utils =  new ConfigTreeUtil(rootList,bodyList);
                List<ConfigTree> result =  utils.getTree();
                for(int i=0;i<result.size();i++){ // 转换一下格式,前端能使用
                    String str =  JSONObject.toJSONString(result.get(i));
                    Map<String, Object> map = JSONObject.parseObject(str, new TypeReference<Map<String, Object>>() {});
                    resultList.add(map);
                }
            }
            return resp.success(resultList);
        } catch (Exception e) {
            logger.log(MyLogUtil.LOG_ERROR,"获取失败!",e);
            return resp.error("获取失败!");
        }

数据库查询的数据结构

 

posted @ 2022-04-25 18:01  梦幻&浮云%  阅读(478)  评论(0编辑  收藏  举报