处理树型结构数据(递归方式)

需求:需要从数据库查询树型结构的数据,并将其转换处理为树型结构的数据类型。这里为了简单,就不从数据库中查数据了,直接使用List造一些数据进行模拟

代码实现:

aaa

实体类:

@JSONField这个注解大概用法看:https://www.cnblogs.com/xieegai/p/8242549.html

https://blog.csdn.net/fxbin123/article/details/78465342

public class Menu {
    @JSONField(ordinal=0)  //这个是设置序列化后显示的优先级(fastJson中的)
    private String id;

    @JSONField(ordinal=1,name = "abc")
    private String parentId;

    @JSONField(ordinal=2)
    private String text;

    @JSONField(ordinal=3)
    private String url;
    @JSONField(ordinal=4)
    private String yxbz;
    @JSONField(ordinal=5)
    private List<Menu> children;

    public Menu(String id,String parentId,String text,String url,String yxbz) {
        this.id=id;
        this.parentId=parentId;
        this.text=text;
        this.url=url;
        this.yxbz=yxbz;
    }

//get、set方法
}

树型结构转换工具类:

public class MenuTree {

    //查询到的所有原始数据
    private List<Menu> menuList = new ArrayList<Menu>();
    public MenuTree(List<Menu> menuList) {
        this.menuList=menuList;
    }

    //建立树形结构
    public List<Menu> builTree(){
        //用来存储处理好的数据
        List<Menu> treeMenus =new  ArrayList<Menu>();
        //先利用getRootNode方法获取根节点,然后根据根节点调用递归方法获取到各个根节点对应的字节点,将其放进上面的List中去
        for(Menu menuNode : getRootNode()) {
            menuNode=buildChilTree(menuNode);
            treeMenus.add(menuNode);
        }
        return treeMenus;
    }

    //递归,建立子树形结构
    private Menu buildChilTree(Menu pNode){
        //用来存放子节点集合
        List<Menu> chilMenus =new  ArrayList<Menu>();
        //根据根节点,遍历父子节点是根节点的节点出来。然后放进上面的集合中去
        //这里递归调用add方法。
        for(Menu menuNode : menuList) {
            if(menuNode.getParentId().equals(pNode.getId())) {
                chilMenus.add(buildChilTree(menuNode));
            }
        }
        //最后将递归得到的所有子节点放进根节点的children的属性中去。
        pNode.setChildren(chilMenus);
        return pNode;
    }

    //获取根节点
    private List<Menu> getRootNode() {
        List<Menu> rootMenuLists =new  ArrayList<Menu>();
        for(Menu menuNode : menuList) {
            if(menuNode.getParentId().equals("0")) {
                rootMenuLists.add(menuNode);
            }
        }
        return rootMenuLists;
    }
}

造数据并测试:
 

public class Hello {
    public static void main(String []args) {
        List<Menu> menuList= new ArrayList<Menu>();
        /*插入一些数据*/
        menuList.add(new Menu("GN001D000","0","系统管理","/admin","Y"));
        menuList.add(new Menu("GN001D100","GN001D000","权限管理","/admin","Y"));
        menuList.add(new Menu("GN001D110","GN001D100","密码修改","/admin","Y"));
        menuList.add(new Menu("GN001D120","GN001D100","新加用户","/admin","Y"));
        menuList.add(new Menu("GN001D200","GN001D000","系统监控","/admin","Y"));
        menuList.add(new Menu("GN001D210","GN001D200","在线用户","/admin","Y"));
        menuList.add(new Menu("GN002D000","0","订阅区","/admin","Y"));
        menuList.add(new Menu("GN003D000","0","未知领域","/admin","Y"));
        /*让我们创建树*/
        MenuTree menuTree =new MenuTree(menuList);
        menuList=menuTree.builTree();
        /*转为json看看效果*/
        String jsonOutput= JSON.toJSONString(menuList);
        System.out.println(jsonOutput);
    }
}

最后查看控制台打印:

将json数据解析后:

树型数据的处理也可以用其他方式,例如sql联表等,但如果此时你不清楚有几级节点/节点的深度是由客户自己录入的,此时用递归就是一种比较好的方式。

aa

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值