【java递归生成树形结构】

17 篇文章 0 订阅
7 篇文章 0 订阅

项目开发中,几乎无法避免的会遇到树形结构,今天和大家分享java后端如何处理数据为树形结构。

前端处理树形结构,后端生成树形结构。

Entity实体层:

   此处省略好几个实体字段。

    /**
     * 孩子节点集合
     */
    private List<OrganizationVO> child = new ArrayList<OrganizationVO>();

Controller层:

OrganizationVO list = organizationService.selectCategoryAndChildrenById(id);

Service业务层:

/**
     * 递归查询本节点的id和孩子节点的id
     * @param id
     * @return
     */
    OrganizationVO selectCategoryAndChildrenById(Long id);

ServiceImpl业务实现:

    /**
     * 递归查询本节点的id和孩子节点的id
     *
     * @param id
     * @return
     */
    @Override
    public OrganizationVO selectCategoryAndChildrenById(Long id) {
        return findChildCatgoryBak(id);
    }
    
    /**
     * 递归算法-算出子节点
     */
    public OrganizationVO findChildCatgoryBak(Long orgId) {
        List<OrganizationVO> childList = new ArrayList<>();
        // 通过id获取所有VO信息
        OrganizationVO organizationVO = iOrganizationService.get(orgId);

        //查找子节点,递归程序必须要有一个出口
        List<OrganizationVO> organizationList = iOrganizationService.getChildren(null, orgId);
        //organizationVO.setChild(organizationList);
        for (OrganizationVO item : organizationList) {
            childList.add(findChildCatgoryBak(item.getId()));
        }
        organizationVO.setChild(childList);
        return organizationVO;
    }

业务之中的判断自己可以加上,比如通过Id获取这条信息是否为null。

测试结果:

{
  "code": 0,
  "message": "获取组织成功",
  "items": {
    "id": 2,
    "createTime": null,
    "modifyTime": "2020-04-21 16:37:35",
    "creatorId": 0,
    "modifierId": 0,
    "parentId": 0,
    "orgName": "电子商品",
    "orgState": "ENABLE",
    "description": "",
    "orgSort": 1,
    "child": [
      {
        "id": 3,
        "createTime": "2020-04-21 16:41:07",
        "modifyTime": "2020-04-22 10:40:52",
        "creatorId": 0,
        "modifierId": 0,
        "parentId": 2,
        "orgName": "电脑",
        "orgState": "ENABLE",
        "description": "",
        "orgSort": 1,
        "child": [
          {
            "id": 21,
            "createTime": "2020-04-23 23:11:45",
            "modifyTime": "2020-04-23 23:11:45",
            "creatorId": null,
            "modifierId": null,
            "parentId": 3,
            "orgName": "笔记本电脑",
            "orgState": "ENABLE",
            "description": "是佛山东莞给",
            "orgSort": null,
            "child": []
          }
        ]
      },
      {
        "id": 13,
        "createTime": "2020-04-22 16:34:08",
        "modifyTime": "2020-04-22 16:34:08",
        "creatorId": null,
        "modifierId": null,
        "parentId": 2,
        "orgName": "新增组织1",
        "orgState": "ENABLE",
        "description": "",
        "orgSort": 4,
        "child": []
      },
      {
        "id": 14,
        "createTime": "2020-04-22 19:07:58",
        "modifyTime": "2020-04-22 19:07:58",
        "creatorId": null,
        "modifierId": null,
        "parentId": 2,
        "orgName": "测试",
        "orgState": "ENABLE",
        "description": "是佛山东莞给",
        "orgSort": null,
        "child": []
      },
      {
        "id": 16,
        "createTime": "2020-04-23 10:13:26",
        "modifyTime": "2020-04-23 10:13:26",
        "creatorId": null,
        "modifierId": null,
        "parentId": 2,
        "orgName": "112",
        "orgState": "ENABLE",
        "description": null,
        "orgSort": null,
        "child": []
      },
      {
        "id": 20,
        "createTime": "2020-04-23 22:33:10",
        "modifyTime": "2020-04-23 22:33:10",
        "creatorId": null,
        "modifierId": null,
        "parentId": 2,
        "orgName": "测试1111111",
        "orgState": "ENABLE",
        "description": null,
        "orgSort": 3,
        "child": []
      }
    ]
  }
}

 

/** * 根据等级查询类目树 * * @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; }
下面是一个简单的 Java 代码示例,用于生成树形结构: ```java public class Node { private String name; private List<Node> children; public Node(String name) { this.name = name; this.children = new ArrayList<>(); } public void addChild(Node child) { this.children.add(child); } public String getName() { return name; } public List<Node> getChildren() { return children; } } public class Tree { private Node root; public Tree(Node root) { this.root = root; } public void print() { print(root, 0); } private void print(Node node, int level) { for (int i = 0; i < level; i++) { System.out.print(" "); } System.out.println(node.getName()); for (Node child : node.getChildren()) { print(child, level + 1); } } } public class Main { public static void main(String[] args) { Node root = new Node("Root"); Node node1 = new Node("Node 1"); Node node2 = new Node("Node 2"); Node node3 = new Node("Node 3"); Node node4 = new Node("Node 4"); Node node5 = new Node("Node 5"); root.addChild(node1); root.addChild(node2); node2.addChild(node3); node2.addChild(node4); node3.addChild(node5); Tree tree = new Tree(root); tree.print(); } } ``` 这个示例中,我们定义了一个 `Node` 类来表示树中的节点,每个节点包含一个名称和一个子节点列表。我们还定义了一个 `Tree` 类来表示整个树,它包含一个根节点。我们使用递归方法打印整个树,每个节点在它的层数上印出两个空格,以形成缩进效果。在 `Main` 类中,我们创建了一个树并打印它。 输出结果如下: ``` Root Node 1 Node 2 Node 3 Node 5 Node 4 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值