当前位置: 首页 > article >正文

java树结构工具-TreeUtil

一、定义结构 

我们假设要构建一个菜单,可以实现系统管理和店铺管理,菜单的样子如下:

系统管理
    |- 用户管理
    |- 添加用户

店铺管理
    |- 商品管理
    |- 添加商品

那这种结构如何保存在数据库中呢?一般是这样的:

idparentIdnameweight
10系统管理5
111用户管理10
1111用户添加11
20店铺管理5
212商品管理10
2212添加添加11

这里需要注意:(如果是多个省份的店铺,需要根据城市使用不同的id)

    菜单             parentId
-----------------------------------------
系统管理                0
    |- 用户管理         1
    |- 添加用户         1

店铺管理   # 北京       0
    |- 商品管理         2
    |- 添加商品         2

店铺管理   # 天津       0
    |- 商品管理         3  # 这里不能使用2
    |- 添加商品         3  # 这里不能使用2

我们看到,每条数据根据parentId相互关联并表示层级关系,parentId在这里也叫外键。

二、构建Tree

public TreeNode(T id, T parentId, String name, Comparable<?> weight)

注:id和parentId需要类型一致(基本数据类型Integer、String、Long。。均可)

例子中使用String

// 构建node列表
List<TreeNode<String>> nodeList = CollUtil.newArrayList();

nodeList.add(new TreeNode<>("1", "0", "系统管理", 5));
nodeList.add(new TreeNode<>("11", "1", "用户管理", 222222));
nodeList.add(new TreeNode<>("111", "11", "用户添加", 0));
nodeList.add(new TreeNode<>("2", "0", "店铺管理", 1));
nodeList.add(new TreeNode<>("21", "2", "商品管理", 44));
nodeList.add(new TreeNode<>("221", "2", "商品管理2", 2));

TreeNode表示一个抽象的节点,也表示数据库中一行数据。 如果有其它数据,可以调用setExtra添加扩展字段。

// 0表示最顶层的id是0
List<Tree<String>> treeList = TreeUtil.build(nodeList, "0");

因为两个Tree是平级的,再没有上层节点,因此为List。

三、自定义字段名

//配置
TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
// 自定义属性名 都要默认值的
treeNodeConfig.setWeightKey("order");
treeNodeConfig.setIdKey("rid");
// 最大递归深度
treeNodeConfig.setDeep(3);

//转换器
List<Tree<String>> treeNodes = TreeUtil.build(nodeList, "0", treeNodeConfig,
        (treeNode, tree) -> {
            tree.setId(treeNode.getId());
            tree.setParentId(treeNode.getParentId());
            tree.setWeight(treeNode.getWeight());
            tree.setName(treeNode.getName());
            // 扩展属性 ...
            tree.putExtra("extraField", 666);
            tree.putExtra("other", new Object());
        });

通过TreeNodeConfig我们可以自定义节点的名称、关系节点id名称,这样就可以和不同的数据库做对应。


http://www.kler.cn/a/153768.html

相关文章:

  • Python之Appium 2自动化测试(Android篇)
  • vue中实现纯数字键盘
  • 3.3 路由器的远程配置
  • Python标准库:random库【侯小啾python领航班系列(十七)】
  • docker 安装elasticsearch集群
  • Encoder、Decoder和Encoder-Decoder
  • Python标准库copy【侯小啾python领航班系列(十五)】
  • UI/UX:学习资料
  • 数据结构:图文详解单链表的各种操作(头插法,尾插法,任意位置插入,删除节点,查询节点,求链表的长度,清空链表)
  • 126. 单词接龙 II
  • git-5
  • MySQL系列 - 数据类型
  • EasyExcel list<Map>批量导出多个sheet
  • Spring学习笔记:Day1
  • httpd软件
  • Unity中Shader编译目标级别
  • Linux C语言 31-网络编程之TCP例程
  • 「随笔」编程中的技术难题与挑战
  • 操作系统,并行性:两个或多个事件在同一时刻发生并发性:两个或多个事件在同一时间间隔内发生 ,就绪状态执行状态阻塞状态
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)