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("获取失败!");
        }

数据库查询的数据结构

 

方法三:

控制层:

/**
     * 获取树形结构
     */
    @PostMapping("/getTreeDgInfolist")
    public AjaxResult getTreeDgInfolist(BsDgInfo bsDgInfo)
    {
        List<BsDgInfo> treeDgInfolist = bsDgInfoService.selectBsDgInfoList(bsDgInfo);
        List<TreeSelectData> treeList = bsDgInfoService.buildDgTreeSelect(treeDgInfolist);
        return success(treeList);
    }

 

实现层:

@Override
    public List<TreeSelectData> buildDgTreeSelect(List<BsDgInfo> treeDgInfolist) {
        List<BsDgInfo> dgTrees = buildDgInfoTree(treeDgInfolist);
        return dgTrees.stream().map(TreeSelectData::new).collect(Collectors.toList());
    }

    /**
     * 构建前端所需要树结构
     *
     * @param treeDgInfolist 菜单列表
     * @return 树结构列表
     */
    public List<BsDgInfo> buildDgInfoTree(List<BsDgInfo> treeDgInfolist)
    {
        List<BsDgInfo> returnList = new ArrayList<BsDgInfo>();
        List<Long> tempList = treeDgInfolist.stream().map(BsDgInfo::getDgId).collect(Collectors.toList());
        for (Iterator<BsDgInfo> iterator = treeDgInfolist.iterator(); iterator.hasNext();)
        {
            BsDgInfo bsDgInfo = (BsDgInfo) iterator.next();
            // 如果是顶级节点, 遍历该父节点的所有子节点
            if (!tempList.contains(bsDgInfo.getParentId()))
            {
                recursionFn(treeDgInfolist, bsDgInfo);
                returnList.add(bsDgInfo);
            }
        }
        if (returnList.isEmpty())
        {
            returnList = treeDgInfolist;
        }
        return returnList;
    }

    /**
     * 递归列表
     *
     * @param list 分类表
     * @param t 子节点
     */
    private void recursionFn(List<BsDgInfo> list, BsDgInfo t)
    {
        // 得到子节点列表
        List<BsDgInfo> childList = getChildList(list, t);
        t.setChildren(childList);
        for (BsDgInfo tChild : childList)
        {
            if (hasChild(list, tChild))
            {
                recursionFn(list, tChild);
            }
        }
    }

    /**
     * 得到子节点列表
     */
    private List<BsDgInfo> getChildList(List<BsDgInfo> list, BsDgInfo t)
    {
        List<BsDgInfo> tlist = new ArrayList<BsDgInfo>();
        Iterator<BsDgInfo> it = list.iterator();
        while (it.hasNext())
        {
            BsDgInfo n = (BsDgInfo) it.next();
            if (n.getParentId().longValue() == t.getDgId().longValue())
            {
                tlist.add(n);
            }
        }
        return tlist;
    }

    /**
     * 判断是否有子节点
     */
    private boolean hasChild(List<BsDgInfo> list, BsDgInfo t)
    {
        return getChildList(list, t).size() > 0;
    }

 

Treeselect树结构实体类
package com.ruoyi.bidDocument.domain;

import com.fasterxml.jackson.annotation.JsonInclude;

import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Treeselect树结构实体类
 * 
 * @author ruoyi
 */
public class TreeSelectData implements Serializable
{
    private static final long serialVersionUID = 1L;

    /** 节点ID */
    private Long id;

    /** 节点名称 */
    private String label;

    private String desc;

    /** 节点禁用 */
    private boolean disabled = false;

    /** 子节点 */
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private List<TreeSelectData> children;

    public TreeSelectData()
    {

    }

    public TreeSelectData(BsDgInfo dgInfo)
    {
        this.id = dgInfo.getDgId();
        this.label = dgInfo.getDgTitle();
        this.desc = dgInfo.getDgDesc();
        this.children = dgInfo.getChildren().stream().map(TreeSelectData::new).collect(Collectors.toList());
    }

    public Long getId()
    {
        return id;
    }

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

    public String getLabel()
    {
        return label;
    }

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

    public boolean isDisabled()
    {
        return disabled;
    }

    public void setDisabled(boolean disabled)
    {
        this.disabled = disabled;
    }

    public List<TreeSelectData> getChildren()
    {
        return children;
    }

    public void setChildren(List<TreeSelectData> children)
    {
        this.children = children;
    }

    public String getDesc()
    {
        return desc;
    }

    public void setDesc(String desc)
    {
        this.desc = desc;
    }
}

 

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