用递归实现构造目录树

目前有一张目录表:CATALOGS,存放目录,目录有多个级别,如根目录,一级目录,二级目录等。二级目录的父级id等于一级目录的id,以此关联。
另外一张表是业务数据表:SHARES,有一个字段catalogId来存放目录id
需要展示所有的数据,并且返回相应的目录层级
如下图:
在这里插入图片描述
实现思路:
首先第一步:查询出所有的SHARES,然后再获取到SHARES所在的目录,拿到这些目录id后,再遍历查询数据库,获取到所有涉及的目录信息。
然后再组装树结构。
上代码:

//目录类
public class CatalogVo {

  //父级id
    private String tmpParentCatalogId;
    //id
    private String editContentId;
    //目录名
    private String tmpCatalogName;
    //排序
    private String sortNumber;
}
//业务数据类
public class DghyYjhcHcxShare implements Serializable {
    @TableId(value = "ID")
    @ApiModelProperty("主键")
    private Long id;
    @ApiModelProperty("图层id")
    private String tcId;
    @ApiModelProperty("目录主键")
    @TableField(exist = false)
    private String catalogId;
  
    private static final long serialVersionUID = 1L;


}

关键代码:递归查询所有父级目录,直到查询到根目录

  /**
     * 查找所有的父级目录
     *
     * @param catalogAll
     * @param plist
     */
    private void getParentCatalog(List<CatalogVo> catalogAll, List<CatalogVo> plist) {
        for (CatalogVo catalogVo : plist) {
            //一级菜单父id为0
            if (!"0".equals(catalogVo.getTmpParentCatalogId())) {
                List<CatalogVo> list = dghyYjhcHcxShareMapper.getCatalogs(null, catalogVo.getTmpParentCatalogId());
                catalogAll.addAll(list);
                getParentCatalog(catalogAll, list);

            }
        }
    }

组装树结构:
先找根节点,然后往下一次组装字节点:

 private List getTree(List<CatalogVo> catalogAll, List<DghyYjhcHcxShare> sharesAll) {
        //先拿出根节点:即父级id为0的数据
        Optional<CatalogVo> root = catalogAll.stream().filter(i -> "0".equals(i.getTmpParentCatalogId())).findFirst();
        if (root.isPresent()) {
            CatalogVo rootVo = root.get();
            String id = rootVo.getEditContentId();
            List list = getchild(id, catalogAll, sharesAll, new ArrayList<>());
            return list;
        }
        return null;
    }




/**
     * 获取当前父id的所有子节点
     *
     * @param id         父id
     * @param catalogAll 所有目录
     * @param sharesAll  所有图层
     * @return {@link List}
     */
    private List getchild(String id, List<CatalogVo> catalogAll, List<DghyYjhcHcxShare> sharesAll, List<DghyYjhcHcxShare> isAddShare) {
        List ret = new ArrayList();

        //看有哪些子目录
        List<CatalogVo> childCatalog = catalogAll.stream().filter(i -> id.equals(i.getTmpParentCatalogId())).collect(Collectors.toList());
        if (CollectionUtils.isNotEmpty(childCatalog)) {
            for (CatalogVo catalogVo : childCatalog) {
                Map<String, Object> map = new HashMap<>();
                //目录
                map.put("types", 0);
                map.put("shares", "1");
                map.put("id", catalogVo.getEditContentId());
                map.put("treeid", "0_" + catalogVo.getEditContentId());
                map.put("pid", catalogVo.getTmpParentCatalogId());
                map.put("name", catalogVo.getTmpCatalogName());
                map.put("label", catalogVo.getTmpCatalogName());
                map.put("text", catalogVo.getTmpCatalogName());
                map.put("sort", catalogVo.getSortNumber());
                map.put("children", getchild(catalogVo.getEditContentId(), catalogAll, sharesAll, isAddShare));
                ret.add(map);
            }


        }
        List<DghyYjhcHcxShare> childTxs = sharesAll.stream().filter(i -> id.equals(i.getCatalogId())).collect(Collectors.toList());
        if (CollectionUtils.isNotEmpty(childTxs)) {
            for (int i = 0; i < childTxs.size(); i++) {
                DghyYjhcHcxShare tx = childTxs.get(i);
                JSONObject item = JSONObject.parseObject(JSONObject.toJSONString(tx));
                item.put("types", 1);
                item.put("shares", "1");
                item.put("id", tx.getId());
                item.put("treeid", "0_" + tx.getId());
                item.put("pid", tx.getCatalogId());
                item.put("name", tx.getGraphName());
                item.put("label", tx.getGraphName());
                item.put("text", tx.getGraphName());
                item.put("sort", i);
                item.put("tcid", tx.getTcId());
                ret.add(item);
                isAddShare.add(tx);
            }
        }
        return ret;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用File类来代表文件和文件夹。如果想要使用Java来显示文件夹的结构,可以使用JTree和DefaultMutableTreeNode类。首先需要创建一个DefaultMutableTreeNode对象来表示根节点,然后递归地遍历文件夹中的所有文件和子文件夹,并将它们作为子节点添加到父节点中,最终将根节点添加到JTree中即可。 以下是一个简单的示例代码,可以显示指定文件夹下所有文件和子文件夹的结构: ``` import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; import java.io.File; public class FolderTree extends JFrame { public FolderTree() { DefaultMutableTreeNode root = new DefaultMutableTreeNode("根目录"); JTree tree = new JTree(root); String folderPath = "C:\\Users\\xxx\\Documents\\test"; File folder = new File(folderPath); addNodes(root, folder); add(new JScrollPane(tree)); setSize(400, 600); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private void addNodes(DefaultMutableTreeNode parentNode, File file) { DefaultMutableTreeNode node = new DefaultMutableTreeNode(file.getName()); parentNode.add(node); if (file.isDirectory()) { for (File subFile : file.listFiles()) { addNodes(node, subFile); } } } public static void main(String[] args) { new FolderTree(); } } ``` 在这个示例中,我们创建了一个名为FolderTree的类,继承自JFrame。在构造函数中,我们创建了一个DefaultMutableTreeNode对象作为根节点,并将其添加到JTree中。然后,我们调用addNodes方法来递归遍历指定的文件夹,并将所有文件和子文件夹作为子节点添加到父节点中。最后,我们将JTree添加到JFrame中,并设置JFrame的大小、可见性和关闭操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值