Java获取树形结构数据

这篇具有很好参考价值的文章主要介绍了Java获取树形结构数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言:

开发前准备:

数据库:

实体类:

VO对象:

代码实现:

Controller层:

Service层:

运行结果:

第二种

前言:

在日常的开发或者工作需求中,我们会用到树形结构数据。树形结构是一个比较常用的数据类型,一般多用于查询包含父子类关系的数据。我们常常通过父级id和层级作为标识,是数据更加形象,从而进行树形数据的展示。

开发前准备:

数据库:

java树形结构查询,树,java,开发语言

-- ----------------------------
-- Table structure for dev_type
-- ----------------------------
DROP TABLE IF EXISTS `dev_type`;
CREATE TABLE `dev_type`  (
  `id` int(50) NOT NULL,
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称',
  `level` tinyint(3) NULL DEFAULT NULL COMMENT '层级 1 2 3',
  `parent_id` int(50) NULL DEFAULT NULL COMMENT '父级id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of dev_type
-- ----------------------------
INSERT INTO `dev_type` VALUES (110, '长安区', 3, 119);
INSERT INTO `dev_type` VALUES (119, '石家庄市', 2, 10086);
INSERT INTO `dev_type` VALUES (10010, '中原区', 3, 456789);
INSERT INTO `dev_type` VALUES (10086, '河北省', 1, NULL);
INSERT INTO `dev_type` VALUES (12313, '高新区', 3, 456789);
INSERT INTO `dev_type` VALUES (123456, '河南省', 1, NULL);
INSERT INTO `dev_type` VALUES (456789, '郑州市', 2, 123456);

SET FOREIGN_KEY_CHECKS = 1;

实体类:

@Data
@TableName("dev_type")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class DevType  {

    private static final long serialVersionUID = 1L;
	@JsonSerialize(using = ToStringSerializer.class)
  private Long id;
    /**
     * 名称
     */
    @ApiModelProperty("名称")
    private String name;
    /**
     * 等级(1 ,2,3)
     */
    @ApiModelProperty("等级(1 ,2,3)")
    private String level;
    /**
     * 父级id
     */
    @ApiModelProperty("父级id")
    private Long parentId;

}

VO对象:

@Data
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class TreeNode extends DevType {


    private static final long serialVersionUID = 1L;

    @ApiModelProperty("子节点")
    private List<TreeNode> child;
}

代码实现:

Controller层:

	@GetMapping("/newTree/list")
	@ApiOperation(value = "树形结构列表", notes = "传入devType")
	public List<TreeNode> newTreeList(DevType devType) {
		List<TreeNode> pages = devTypeService.newTreeList(devType);
		return pages;
	}

Service层:

/**
	 * id和 parentId 有对应关系  父级id 为子级的 parentId
	 * 根据level也进行区分层级
	 * 什么也不传 按照树形结构查出所有数据
	 * @param devType
	 * @return
	 */
	@Override
	public List<TreeNode> newTreeList(DevType devType) {
		if (devType == null || (devType.getLevel() == null && devType.getId() == null && devType.getParentId() == null)) {
			devType.setLevel("1");
		}
		QueryWrapper<DevType> queryWrapper = new QueryWrapper<>();
		// 构造查询条件
		queryWrapper.eq(devType.getId() != null, "id", devType.getId())
				.eq(StringUtils.isNotBlank(devType.getLevel()), "level", devType.getLevel())
				.eq(devType.getParentId() != null, "parent_id", devType.getParentId());

		return getTree(queryWrapper);
	}

	private List<TreeNode> getTree(QueryWrapper<DevType> queryWrapper) {

		List<DevType> list = this.list(queryWrapper);
		List<TreeNode> voList = new ArrayList<>(list.size());
		for (DevType child : list) {
			TreeNode childVO = new TreeNode();
			BeanUtils.copyProperties(child, childVO);

			QueryWrapper<DevType> childQueryWrapper = new QueryWrapper<>();
			childQueryWrapper.eq("parent_id", child.getId());
			childVO.setChild(getTree(childQueryWrapper));

			voList.add(childVO);
		}
		return voList;
	}

运行结果:

java树形结构查询,树,java,开发语言

[
    {
        "id": "10086",
        "name": "河北省",
        "level": "1",
        "child": [
            {
                "id": "119",
                "name": "石家庄市",
                "level": "2",
                "parentId": 10086,
                "child": [
                    {
                        "id": "110",
                        "name": "长安区",
                        "level": "3",
                        "parentId": 119
                    }
                ]
            }
        ]
    },
    {
        "id": "123456",
        "name": "河南省",
        "level": "1",
        "child": [
            {
                "id": "456789",
                "name": "郑州市",
                "level": "2",
                "parentId": 123456,
                "child": [
                    {
                        "id": "10010",
                        "name": "中原区",
                        "level": "3",
                        "parentId": 456789
                    },
                    {
                        "id": "12313",
                        "name": "高新区",
                        "level": "3",
                        "parentId": 456789
                    }
                ]
            }
        ]
    }
]

第二种:

    @GetMapping("/tree/list")
	@ApiOperationSupport(order = 2)
	@ApiOperation(value = "树形结构列表", notes = "")
	public R<List<TreeNode>> getDataList() {
		List<DevType> pages = devTypeService.list();
		List<TreeNode> devTypes = buildTree(pages, null);
		return R.data(devTypes);
	}

    private List<TreeNode> buildTree(List<DevType> devTypes, Long parentId) {
		List<TreeNode> tree = new ArrayList<>();

		for (DevType devType : devTypes) {
			if (devType.getParentId() == parentId) {
				TreeNodetreeNode = new TreeNode();
				BeanUtils.copyProperties(devType,treeNode);
				// 递归构建子树
				List<TreeNode> children = buildTree(devTypes, devType.getId());
				treeNode.setChildren(children);
				tree.add(treeNode);
			}
		}

		return tree;
	}

第三种:

通过stream获取: 

	/**
	 * 使用stream获取树形结构
	 * @return
	 */
	@GetMapping("/new/tree")
	@ApiOperationSupport(order = 2)
	@ApiOperation(value = "树形结构列表", notes = "传入devType")
	public R<List<TreeNode>> newTree() {
		List<DevType> pages = devTypeService.list();			//1
		List<TreeNode> list = pages.stream().map(devType -> {
			TreeNode vo = new TreeNode();
			BeanUtils.copyProperties(devType, vo);
			return vo;
		}).collect(Collectors.toList());						//2
		//1、2 两部可以通过mapper方法实现,直接转换成VO数据
		List<TreeNode> TreeMenu = list.stream().filter(m -> m.getParentId() == null).map(
				(m) -> {
					m.setChildren(getChildrens(m, list));
					return m;
				}
		).collect(Collectors.toList());
		return R.data(TreeMenu);
	}

	private List<TreeNode> getChildrens(TreeNode root, List<TreeNode> all) {

		List<TreeNode> children = all.stream().filter(m -> {
			return Objects.equals(m.getParentId(), root.getId());
		}).map(
				(m) -> {
					m.setChildren(getChildrens(m, all));
					return m;
				}
		).collect(Collectors.toList());
		return children;
	}

         在这里,我们需要先搞清楚对应的父子关系,只有捋顺了关系之后才能进行代码的书写。第一种方式是我们什么都不传的情况下,默认查出的是全部的数据。如果想要查某一条下面具体的子类,可以传入对应的id和层级level。第二种是查出全部的树形结构数据。在此特作分享,给大家提供不一样的思路。文章来源地址https://www.toymoban.com/news/detail-658650.html

到了这里,关于Java获取树形结构数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SQL开发实战技巧】系列(三十一):数仓报表场景☞分层查询如何只查询树形结构某一个分支?如何剪掉一个分支?

    【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串UNION与OR的使用注意事项 【SQL开发实战技巧】系列

    2023年04月13日
    浏览(36)
  • Java 高效构建树形结构

    构造树形结构通常使用递归遍历元素,构造元素的子集,直至子级全部构建完成,返回父级,最终完成树的构建,这种方法的时间复杂度基本上在 O ( N 2 ) O(N^2) O ( N 2 ) ,数据量比较大的时候性能大幅下降,耗时严重。通过不断实践与优化,得出一种可将构造树形结构的性能提

    2024年02月16日
    浏览(33)
  • 数据结构 C语言 树形结构 简单目录管理系统

    在图书、操作系统文件夹、学生等管理系统中,目录管理是必要环节,如何高效搜寻与低复杂度存储是实现这一环节的关键性问题。本课程设计需完成一种基于多叉树结构简单目录管理系统,该系统能以交互式界面进行创建目录、删除目录、查找目录、修改目录、层次遍历目

    2024年02月07日
    浏览(39)
  • 数据结构 C语言 树形结构 简单目录管理系统

    在图书、操作系统文件夹、学生等管理系统中,目录管理是必要环节,如何高效搜寻与低复杂度存储是实现这一环节的关键性问题。本课程设计需完成一种基于多叉树结构简单目录管理系统,该系统能以交互式界面进行创建目录、删除目录、查找目录、修改目录、层次遍历目

    2024年02月04日
    浏览(36)
  • c语言数据结构——树形结构之树和二叉树

    二叉树有什么用? 二叉树应用非常广泛。 在操作系统源程序中,树和森林被用来构造文件系统。我们看到的window和linux等文件管理系统都是树型结构。在编译系统中,如C编译器源代码中,二叉树的中序遍历形式被用来存放C 语言中的表达式。其次二叉树本身的应用也非常多,

    2023年04月18日
    浏览(33)
  • Java 8 中的 Stream 轻松遍历树形结构

    直接上代码

    2024年02月01日
    浏览(29)
  • 树形结构的表设计与Java接口实现

    树形结构在日常开发中很常见,如: 再比如: 还有: 这种树形结构,其 核心字段为parentId ,即父节点id。先看上面课程信息树形结构的表设计: 精髓就是:每条数据, id是它自己的名字,parentId是它爹的名字 。根据parentId能知道它爹是谁,而 它的id就是它儿子的parentId ,

    2024年02月07日
    浏览(27)
  • mysql数据库递归查询树形结构(适用场景:菜单多级分类,多级关联评论查询),用strea流把list转成树的方法详解

    层次关系: 现在的需求是把这个层级关系,在前端显示出来,后端的处理方法有两种: 1.直接把全部的数据从数据库中拿到,然后在java代码里面使用树形结构来进行解析,但是这种做法只能在数据量比较小的时候使用,然后数据量一大会造成内存溢出 2.在mysql中创建一个函数

    2024年02月05日
    浏览(28)
  • 关于树形结构查询的接口设计

    2024年02月11日
    浏览(27)
  • javaScript 树形结构 递归查询方法。

    1. 函数递归定义          程序调用自身的编程技巧称为递归 ( recursion)。 2.使用条件   1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。  2.每次递归调用之后越来越接近这个限制条件。  3.既然是自己调用自己,那么整个逻辑一定是很有规律,对应的传

    2024年02月14日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包