Rapid data will be assembled into a parent-child relationship parent-child list

Disclaimer: This article is a blogger original article, shall not be reproduced without the bloggers allowed. https://blog.csdn.net/QWERTY1994/article/details/85251361

If there is a parent-child set of data, or unlimited grandfather parent-child relationship, the following manner may be used to quickly assemble tree

Inheritance BeanTree



import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class BeanTree implements Serializable {
    private String id;
    /**
     * parentId为空 或者 -1 即表示 顶级节点
     */
    private String parentId;
    private String parentIds;
    private List<BeanTree> childList = new ArrayList<>();
    public String getParentIds() {
        return parentIds;
    }

    public void setParentIds(String parentIds) {
        this.parentIds = parentIds;
    }



    public List<BeanTree> getChildList() {
        return childList;
    }

    public void setChildList(List<BeanTree> childList) {
        this.childList = childList;
    }

    public String getId() {
        return id;
    }

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

    public String getParentId() {
        return parentId;
    }

    public void setParentId(String parentId) {
        this.parentId = parentId;
    }
}

2.TreeFastUtils.java



import com.thinkgem.jeesite.modules.course.entity.BeanTree;
import org.apache.commons.collections.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 快速将一些list 组成父子树关系 并且自动拼接parentIds
 *
 * 必须有以下结构
 */
public class TreeFastUtils {

    // list以tree归类
    public static <T extends BeanTree> List<T> getTree(List<T> treeList) {
        List<T> result = new ArrayList<>();
        //获取所有顶级节点
        List<T> treeRoot = getTreeRoot(treeList);
        //移除顶级节点
        treeList.removeAll(treeRoot);
        //遍历获取子节点
        treeRoot.forEach(root -> result.add(getChild(treeList, root)));
        return result;
    }

    /**
     * 获取所有顶级节点
     *
     * @param nodeList
     * @return
     */
    private static <T extends BeanTree> List<T> getTreeRoot(List<T> nodeList) {
        return nodeList.stream().filter(menu -> {
            Boolean flag= (StringUtils.isBlank(menu.getParentId()) || "-1".equals(menu.getParentId()));
            if(flag){
                menu.setParentIds("0,");
            }
            return  flag;
        }).collect(Collectors.toList());
    }


    /**
     * 递归过获取无限级子节点
     *
     * @param nodeList
     * @param menu
     * @return
     */
    private static<T extends BeanTree> T getChild(List<T> nodeList, T menu) {
        List<T> childList = getChildList(nodeList, menu);
        if (CollectionUtils.isNotEmpty(childList)) {
            //移除已经遍历过的节点
            nodeList.removeAll(childList);
//            childList.forEach(child -> menu.getChildList().add(getChild(childList, child)));
            childList.forEach(child -> menu.getChildList().add(getChild(nodeList, child)));
        }
        return menu;
    }

    /**
     * 得到子节点列表
     * parentId为空或者Null 或者为-1 表示顶级节点
     * @param nodeList
     * @param menu 父节点
     * @param <T>
     * @return
     */
    private static  <T extends BeanTree> List<T> getChildList(List<T> nodeList, T menu) {
        return nodeList.stream().filter(menu_ -> {
            Boolean flag= StringUtils.isBlank(menu_.getParentId())? false : menu_.getParentId().equals(menu.getId());
            if(flag){
                menu_.setParentIds(menu.getParentIds() + menu.getId() +",");
            }
            return flag;
        }).collect(Collectors.toList());
    }
}

 

Guess you like

Origin blog.csdn.net/QWERTY1994/article/details/85251361