Java对List结构数据递归实现树形结构数据

好记性不如烂笔头,在此收录两个采用递归将List数据组织成树结构数据的方法。

方法1:

定义实体类:

public class Menu {
    private String id;
    private String parentId;
    private String name;
    private List<Menu> children;

    public Menu() {
    }

    public Menu(String id, String parentId, String name) {
        this.id = id;
        this.parentId = parentId;
        this.name = name;
    }

    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;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

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

调用实现:

public class MenuTest {
    public static void main(String[] args) throws JsonProcessingException {
        // 构造测试数据
        Menu menu1 = new Menu("1", null, "1");
        Menu menu2 = new Menu("1-1", "1", "1");
        Menu menu3 = new Menu("1-1-1", "1-1", "1-1-1");
        Menu menu4 = new Menu("2", null, "2");
        Menu menu5 = new Menu("2-1", "2", "2-1");
        Menu menu6 = new Menu("2-1-1", "2-1", "2-1-1");
        Menu menu7 = new Menu("1-2", "1", "1-2");

        List<Menu> list = new ArrayList<>();
        list.add(menu1);
        list.add(menu2);
        list.add(menu3);
        list.add(menu4);
        list.add(menu5);
        list.add(menu6);
        list.add(menu7);

        // 生成树的方法
        List<Menu> tree = createTree(list);
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(tree);
        System.out.println(json);
    }

    // 构造树形结构
    public static List<Menu> createTree(List<Menu> sourceList) {
        List<Menu> list = new ArrayList<>();
        for (Menu menu : sourceList) {
            // 找到根节点进行处理,找下一级节点
            if (null == menu.getParentId()) {
                // 把所有的根节点放到一个list
                list.add(findChildren(menu, sourceList));
            }
        }

        return list;
    }

    public static Menu findChildren(Menu rootMenu, List<Menu> list) {
        // 这个方法是在找rootMenu的所有子节点,然后返回rootMenu
        for (Menu menu : list) {
            if (rootMenu.getId().equals(menu.getParentId())) {
                if (rootMenu.getChildren() == null) {
                    rootMenu.setChildren(new ArrayList<>());
                }
                // 把这个节点menu作为新的根节点继续向下构造树,再把构造的结果作为rootMenu的子节点
                rootMenu.getChildren().add(findChildren(menu, list));
            }
        }
        return rootMenu;
    }
}

方法2:

定义实体类:

public class TreeBean {

    /**
     * id
     */
    private Integer id;

    /**
     * 名称
     */
    private String name;

    /**
     * 父id ,根节点为0
     */
    public Integer parentId;

    /**
     * 子节点信息
     */
    public List<TreeBean> childList;

    public TreeBean() {
    }

    public TreeBean(Integer id, String name, Integer parentId, List<TreeBean> childList) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
        this.childList = childList;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getParentId() {
        return parentId;
    }

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

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

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

    /**
     * 初始化数据
     * 
     * @return
     */
    public List<TreeBean> initializationData() {
        List<TreeBean> list = new ArrayList<>();
        TreeBean t1 = new TreeBean(1, "广东省", 0, new ArrayList<>());
        TreeBean t2 = new TreeBean(2, "湖南省", 0, new ArrayList<>());
        TreeBean t3 = new TreeBean(3, "广州市", 1, new ArrayList<>());
        TreeBean t4 = new TreeBean(4, "长沙市", 2, new ArrayList<>());
        TreeBean t5 = new TreeBean(5, "白云区", 3, new ArrayList<>());
        TreeBean t6 = new TreeBean(6, "黄浦区", 3, new ArrayList<>());
        TreeBean t7 = new TreeBean(7, "白云街道", 5, new ArrayList<>());
        TreeBean t8 = new TreeBean(8, "深圳市", 1, new ArrayList<>());
        TreeBean t9 = new TreeBean(9, "宝安区", 8, new ArrayList<>());
        TreeBean t10 = new TreeBean(10, "福田区", 8, new ArrayList<>());
        TreeBean t11 = new TreeBean(11, "南山区", 8, new ArrayList<>());
        TreeBean t12 = new TreeBean(12, "南山街道", 11, new ArrayList<>());
        TreeBean t13 = new TreeBean(13, "芙蓉区", 4, new ArrayList<>());
        TreeBean t14 = new TreeBean(14, "岳麓区", 4, new ArrayList<>());
        TreeBean t15 = new TreeBean(15, "开福区", 4, new ArrayList<>());
        TreeBean t16 = new TreeBean(16, "岳阳市", 2, new ArrayList<>());
        TreeBean t17 = new TreeBean(17, "岳麓街道", 14, new ArrayList<>());
        list.add(t1);
        list.add(t2);
        list.add(t3);
        list.add(t4);
        list.add(t5);
        list.add(t6);
        list.add(t7);
        list.add(t8);
        list.add(t9);
        list.add(t10);
        list.add(t11);
        list.add(t12);
        list.add(t13);
        list.add(t14);
        list.add(t15);
        list.add(t16);
        list.add(t17);
        return list;
    }

}

调用实现:

public class TreeTest {

    public static void main(String[] args) throws JsonProcessingException {
        // 获取数据
        List<TreeBean> treeBeans = new TreeBean().initializationData();
        // 获取父节点
        List<TreeBean> collect = treeBeans.stream().filter(t -> t.getParentId() == 0).map(m -> {
            m.setChildList(getChildren(m, treeBeans));
            return m;
        }).collect(Collectors.toList());
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(collect);
        System.out.println(json);

    }

    /**
     * 递归查询子节点
     * 
     * @param root 根节点
     * @param all  所有节点
     * @return 根节点信息
     */
    public static List<TreeBean> getChildren(TreeBean root, List<TreeBean> all) {
        List<TreeBean> children = all.stream().filter(t -> {
            return Objects.equals(t.getParentId(), root.getId());
        }).map(m -> {
            m.setChildList(getChildren(m, all));
            return m;
        }).collect(Collectors.toList());
        return children;
    }
}

感谢分享,原文链接如下:

1、Java递归实现树形结构数据_java递归查询树结构-CSDN博客

2、https://www.cnblogs.com/chengxuxiaoyuan/p/17134901.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值