Java 层级数据,树的生成

概述

一直忙于工作很久没有抽出时间写博客了,最近有点闲暇时间,接触到了一些层级数据,需求要求生成树,先大体看一下如下的数据层级,大体分为5个层级,分别是5是4的子节点,4是3的子节点,3是2的子节点,2是1的子节点,1是根节点,

在这里插入图片描述
要求生成类似level1下挂level2的数据格式,前端拿到后就能生成类似目录层级的数据了
在这里插入图片描述

解决办法

如何做呐?首先考虑一个问题是树的生成在mysql5.x版本中是无法直接生成的,所以基本上就只能将数据取出来在java端对树进行生成

首先生成一个类AreaVo ,这个AreaVo中有一个包含自己的List

@Getter
@Setter
@ToString
public class AreaVo extends Area{

private List<AreaVo> areaChildList = new ArrayList();

}

接下来看看是如何生成树的,大体步骤都在注释中,末尾会有个小总结,读者,可以根据需要看看

@GetMapping
    public Response areaInfoService(){
		
		//我们首先通过service获取库中的所有数据
        List<Area> areas = areaService.list();
		
		//将数据转换为上面我们创建的vo,至于为什么要有一个vo继承Area其间又有一个包含自己的List
		//能给出的答案是,在与service相关的entity,自有其作用,创建vo是为了能够让它即有Area的属性
		//又能将子类挂在其中,又或许是单一职责的原则让我们这样设计这个vo
        List<AreaVo> areaVos = areas.stream().map(e -> {
                    AreaVo areaVo  = new AreaVo();
                    BeanUtils.copyPropertiesIgnoreNull(e, areaVo);
                    return areaVo;
                }
        ).collect(Collectors.toList());

        return Response.success(findRootList(areaVos));
    }

    private List<AreaVo> findRootList(List<AreaVo> areaVos) {
		
		//通过List Stream 过滤出根节点的List
        List<AreaVo> rootLists = areaVos.stream().filter(e -> e.getLevel() == 1).collect(Collectors.toList());
		//最后一步将List转为vo
        listTransferToTree(areaVos,rootLists,1);

        return rootLists;

    }

    private void listTransferToTree(List<AreaVo> areaVos,List<AreaVo> rootLists,Integer level) {


        for (AreaVo areaVo: rootLists){

            Integer nextLevel = level+1;
            //筛出下一层级的数据并且要取得parentId和当前根节点id一样的数据,
            //也就是当前根节点的子节点
            List<AreaVo> nextRootLevelAreaInfo =
                    areaVos.stream().filter(e -> e.getLevel().equals(nextLevel) && e.getParentId().equals(areaVo.getId())).collect(Collectors.toList());

			//将子节点挂到符层级下
            areaVo.setAreaInfoCopy1VoList(nextRootLevelAreaInfo);
			
			//递归寻找子节点下的下一个子节点,直到所有节点全部被搜寻完
            listTransferToTree(areaInfoCopy1Vos,nextRootLevelAreaInfo,nextLevel);

        }

    }

我们的大体思路是遍历每一个根节点,尝试在层级中获取该根节点的子层级节点,如果该根节点的子层级节点存在,那么,将该子层级节点存放在根节点的层级中,然后以该根节点的子层级节点为根节点,寻找该根节点的子层级节点,如果该根节点的子层级节点存在,那么,将该子层级节点存放在根节点的层级中,然后以该根节点的子层级节点为根节点,寻找该根节点的子层级节点,如此反复,直到将所有节点遍历完为止,根节点存在子节点,就挂到根节点上,以该根节点的子节点为根节点,再次调用这个函数寻找子节点,直到所有节点遍历完为止,当所有节点遍历完了,根节点下的所有子节点都挂到根节点下了,所以整颗树也就成形了,所以从List到树的转化过程也就完成了

大体这样,除了树之外我们还会涉及到一个权限的验证,它的大体意思是,一个用户可以对应多个角色,一个角色可以对应多个用户,一个角色可以对应多个权限,一个权限可以分给多个角色,那么当请求过来的时候,我们就可以在数据库中取到当前用户用户的角色及角色对应的权限,当我们拿到用户的权限的时候,就可以在拦截器端验证这些模块用户是否能访问,不能访问的则给出用户无权访问的页面即可,权限验证的思路大体是这样的,往后吧,有时间再看看这部分的博文,没有时间就再说了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: three.js是一个用于创建WebGL渲染的JavaScript库,可以用来呈现三维模型。在three.js中,我们可以通过层级模型和结构来管理和组织多个对象的关系和位置。 层级模型在three.js中使用Object3D类的实例来表示,它可以作为一个容器,包含其他的3D对象或层级模型。通过将对象添加到层级模型中,我们可以实现对它们的组织和管理。例如,我们可以创建一个层级模型用于表示一个房间,然后将墙、地板、家具等对象添加到层级模型中。这样,当我们对该层级模型进行旋转或平移操作时,其中的所有对象都会相应地进行变换。 结构是一种层次组织的方式,在three.js中也可以应用于层级模型的组织。通过在层级模型中添加多个层级模型,我们可以创建一个包含多层次的结构。例如,我们可以创建一个根层级模型,用来表示整个场景,然后再在根层级模型中添加多个子层级模型,分别表示不同的物体和场景组件。这样,我们就可以通过操作结构的不同层级来对整个场景进行管理。 举个例子,假设我们要创建一个虚拟城市的三维模型。我们可以创建一个根层级模型来表示整个城市,然后再在根层级模型中添加多个子层级模型,分别用于表示不同的建筑物、道路、车辆等。这样,我们可以通过结构的层级关系来管理和控制城市中的各个组成部分。 综上所述,通过three.js的层级模型和结构,我们可以方便地组织和管理多个对象的关系和位置,从而创建出复杂的三维模型场景。 ### 回答2: three.js层级模型是指通过three.js库创建的模型中存在不同层级的关系。在three.js中,可以通过添加子对象来构建层级关系,子对象可以有自己的位置、旋转和缩放属性。这种层级结构能够使得模型的各个部分可以独立运动或者进行组合动作。 举个例子,我们可以创建一个结构的模型,干作为整体的基础部分,枝作为干的子对象,叶子作为枝的子对象。这样的层级结构可以通过设置每个子对象的位置、旋转和缩放来实现的展示效果。 首先,我们可以创建一个干的几何体和材质,并将它们合并到一个Mesh对象中。然后,创建枝的几何体和材质,并将其作为干的子对象,通过设置枝的位置来使其连接到干上。接着,创建叶子的几何体和材质,并将其作为枝的子对象,同样设置叶子的位置来连接到枝上。 通过对枝和叶子的子对象进行旋转和缩放操作,可以实现的分支和展开效果。另外,可以通过模型的整体旋转和缩放来实现整个的运动和变化。 总之,通过three.js库提供的层级模型功能,我们可以构建复杂的结构模型,实现的展示和动画效果。这种层级结构使得模型的各个部分可以独立控制,为模型的展示和交互提供了更多灵活性和自由度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值