代码中一些树结构的使用往往会减少很多数据库操作

关于数据结构的重要性,在我入行8个月的时候,我才发现,代码想写的好数据结构的应用是必不可少的,重要性的话想要另开一片谈谈感想。下面介绍一下咱们做项目时通用的树结构,既减少代码量,又让代码更加优雅,引用大佬们经常说的如何让代码更加优雅。。。哈哈(o゜▽゜)o☆

上个接收实体代码块:

public class Tree {

    @ApiModelProperty("ID")
    private String id;

    @ApiModelProperty("节点名称")
    private String label;

    @ApiModelProperty("父节点id")
    private String parentId;

    @ApiModelProperty("子节点列表")
    private List<Tree> children;
}

通过这个实体将数据库里你的各种父子数据查出来,也许说的不准确,见谅,大概这么个意思。

姑且将查出来的方法叫List<Tree> getTreeList();

查出来后咱们把数据进行组合,让咱们便于使用,

//传入查出数据,和你想要的数据的父节点
public Tree combineTree(List<Tree> treeList, String Code) {
        Tree result = null;
        if (treeList != null && treeList.size() != 0) {
            for (Tree tree1 : treeList) {
                for (Tree tree2 : treeList) {
                    if (StringUtils.isNotBlank(tree2.getParentId()) && tree2.getParentId().equals(tree1.getId())) {
                        if (tree1.getChildren() == null) {
                            List<Tree> children = Lists.newArrayList();
                            tree1.setChildren(children);
                        }
                        tree1.getChildren().add(tree2);
                    }
                }
                if (StringUtils.isNotBlank(Code) && tree1.getId().equals(Code)) {
                    result = tree1;
                } else if (StringUtils.isBlank(tree1.getParentId())) {
                    result = tree1;
                }
            }
        }
        return result;
    }

然后再转回list集合

public List<Tree> TreeToList(Tree tree) {
        List<Tree> result = Lists.newArrayList();
        Queue<Tree> queue = new LinkedList<>();
        queue.offer(tree);
        while (!queue.isEmpty()) {
            Tree treeInQueue = queue.poll();
            if (treeInQueue.getChildren() != null && treeInQueue.getChildren().size() != 0) {
                for (Tree treeInQueueChild : treeInQueue.getChildren()) {
                    queue.offer(treeInQueueChild);
                }
            }
            result.add(treeInQueue);
        }
        return result;
    }

有人可能会疑问,转来转去不和没转一样吗?其实有点不一样,这个是取到了你想要的父节点下面的数据了。

    有人可能会说,那给个数据库条件直接查不就行了吗,这样多费事。其实当一
 个项目都需要这样一个通用的表来归纳一颗树的时候,你一次次的进行遍历循环
 查然后给其他实体set数据的时候。数据库的操作 无形中会增加成千上百次(举
个例子说的也可能不准,意思是操作数据库太多)。

这样处理的话你只需要查一次所有数据,然后通过代码将你想要的取出就行。最后,将你想要的传给你想set或者想查的sql里进行一个批量循环。也能节省很多事,这几个方法可以通用到项目里,省去了好多事。

上个流转列表然后转数组。

List<String> strings = tree.stream().map(Tree::getId).collect(Collectors.toList());
String[] s = strings.toArray(new String[strings.size()]);

然后上面的数组可以批量塞入一些需要的地方,大家结合自己实际情况使用,也许我用的复杂了。
(我认为直接使用转成的那个list集合也行,哈哈o( ̄▽ ̄)o)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锐rui3g

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值