树的构造方式之一

树节点

@Data
public class Tree {

    /**
     * 节点id
     */
    private String id;

    /**
     * 节点父id
     */
    private String pid;

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

    @Override
    public String toString() {
        return "Tree [id=" + id + ", pid=" + pid + ", name=" + name + "]";
    }
}

树菜单处理

/**
 * 递归类 (菜单树)
 *
 * @author ztw
 * @date 2023/6/30
 */
public class MenuTree {
    public MenuTree(List<Tree> trees) {
        menuList(trees);
    }

    /**
     * 临时变量,记录传入的节点
     */
    private List<Tree> menuCommon;

    /**
     * 待返回的菜单树对象集
     */
    private List<Object> list = new ArrayList<Object>();

    /**
     * 提供接口获取菜单树
     *
     * @return 菜单树
     */
    public List<Object> getList() {return list;}

    /**
     * 组装菜单树
     * 组装了的菜单树 存有第一级节点,每个节点又包含子节点集
     *
     * @param menu 数据集
     */
    private void menuList(List<Tree> menu) {
        this.menuCommon = menu;
        for (Tree x : menu) {
            // LinkedHashMap 双向链表
            Map<String, Object> mapArr = new LinkedHashMap<String, Object>();
            // 如果父级是0
            if (x.getPid() == "0") {
                mapArr.put("id", x.getId());
                mapArr.put("name", x.getName());
                mapArr.put("pid", x.getPid());
                mapArr.put("childList", menuChild(x.getId()));
                list.add(mapArr);
            }
        }
    }

    /**
     * 递归获取
     * 组装id鱼id的子集
     *
     * @param id 父级
     * @return id的子节点集
     */
    private List<?> menuChild(String id) {
        List<Object> lists = new ArrayList<Object>();
        // 遍历全集,找pid=id的节点,也就是id的子节点
        for (Tree a : menuCommon) {
            Map<String, Object> childArray = new LinkedHashMap<String, Object>();
            // id 的子节点  有子节点才会进入,不然就结束方法递归了
            if (a.getPid() == id) {
                childArray.put("id", a.getId());
                childArray.put("name", a.getName());
                childArray.put("pid", a.getPid());
                // 组装id的字节点的时候,也组装该子节点的子节点集
                childArray.put("childList", menuChild(a.getId()));
                lists.add(childArray);
            }
        }
        // id的子节点对象集
        return lists;
    }
}

测试

  @Test
    public void methodNameTest() {
        List<Tree> data = new ArrayList<Tree>();

        // 获取节点数据
        Tree tree = new Tree();
        tree.setId("1");
        tree.setPid("0");
        tree.setName("系统管理");

        data.add(tree);

        tree = new Tree();

        tree.setId("2");
        tree.setPid("1");
        tree.setName("管理员列表");
        data.add(tree);

        tree = new Tree();
        tree.setId("3");
        tree.setPid("2");
        tree.setName("新增管理员");
        data.add(tree);

        tree = new Tree();
        tree.setPid("0");
        tree.setId("4");
        tree.setName("导览管理");
        data.add(tree);

        tree = new Tree();
        tree.setId("5");
        tree.setPid("4");
        tree.setName("POI管理");
        data.add(tree);

        System.out.println(data.toString());
        // 菜单树
        List<Object> list = new MenuTree(data).getList();
        // System.out.println(list.toString());
        // 将集合转换为JSON数组
        System.out.println(JSONArray.toJSON(list));
    }

 

posted on 2023-07-23 19:42  or追梦者  阅读(8)  评论(0编辑  收藏  举报