java递归生成树

实现步骤:

创建一个生成树的基类TreeNode;

package permission;


import java.util.ArrayList;
import java.util.List;


public class TreeNode {
private String id;  
    private String name;  
    private String desc;  
    private String pid;  
    private List<TreeNode> children;  
    public TreeNode() {  
        super();  
    }  
      
    public TreeNode(String id, String name, String desc, String pid) {  
        super();  
        this.id = id;  
        this.name = name;  
        this.desc = desc;  
        this.pid = pid;  
        this.children = new ArrayList<TreeNode>();  
    }  
  
  
    public String getId() {  
        return id;  
    }  
    public void setId(String id) {  
        this.id = id;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public String getDesc() {  
        return desc;  
    }  
    public void setDesc(String desc) {  
        this.desc = desc;  
    }  
    public String getPid() {  
        return pid;  
    }  
    public void setPid(String pid) {  
        this.pid = pid;  
    }  
  
    public List<TreeNode> getChildren() {  
        return children;  
    }  
  
    public void setChildren(List<TreeNode> children) {  
        this.children = children;  
    }  

}

测试类:

package permission;


import java.util.ArrayList;
import java.util.List;


import com.alibaba.fastjson.JSON;


public class RecursiveTree {
public static void main(String[] args) {
TreeNode root = new TreeNode("1", "中国", "中国", "");
 TreeNode node1 = new TreeNode("11", "北京", "北京", "1");  
       TreeNode node2 = new TreeNode("12", "上海", "上海", "1");  
       TreeNode node3 = new TreeNode("13", "山东", "山东", "1");  
       TreeNode node4 = new TreeNode("131", "潍坊", "潍坊", "13");  
       TreeNode node5 = new TreeNode("1311", "安丘", "安丘", "131");  
       TreeNode node6 = new TreeNode("111", "朝阳区", "朝阳区", "11");  
       List<TreeNode> nodes = new ArrayList<TreeNode>();
       nodes.add(root);  
       nodes.add(node1);  
       nodes.add(node2);  
       nodes.add(node3);  
       nodes.add(node4);  
       nodes.add(node5);  
       nodes.add(node6);
       System.out.println(switchNodeListToTree(nodes));  
}
/**
* @author zheng
* 自动将节点数据转化为树结构
* @method switchNodeListToTree
* @param nodes
* @return
* @return String
* @date 2018年4月12日 上午9:33:01
*/
public static String switchNodeListToTree(List<TreeNode> nodes){
TreeNode root = getRoot(nodes);
root = recursive(root, nodes);  
        return JSON.toJSONString(root, true); 
}
/**
* @author zheng
* 递归添加子节点
* @method recursive
* @param node
* @param nodes
* @return
* @return TreeNode
* @date 2018年4月12日 上午9:46:35
*/
public static TreeNode recursive(TreeNode rootNode,List<TreeNode> nodes){
for(TreeNode treeNode :nodes){
if(treeNode.getPid().equals(rootNode.getId())){
rootNode.getChildren().add(treeNode);  
           recursive(treeNode, nodes);
}
}
return rootNode; 
}

public static TreeNode getRoot(List<TreeNode> nodes){
TreeNode root = null;  
        if(nodes != null && nodes.size() > 0){  
            for (TreeNode treeNode : nodes) {  
                if(treeNode.getPid().endsWith("")){  
                    root = treeNode;  
                    break;  
                }  
            }  
        }  
        return root;  
}

}

转换json时候用到的工具类,maven

    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/** * 根据等级查询类目树 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目树,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装树 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级树返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值