IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 树型结构设计和实现菜单树(使用Java8 stream流处理)、list集合转换为String以分号隔开 -> 正文阅读

[开发测试]树型结构设计和实现菜单树(使用Java8 stream流处理)、list集合转换为String以分号隔开

树型结构设计和实现(菜单树)

一、数据库设计

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for tree
-- ----------------------------
DROP TABLE IF EXISTS `tree`;
CREATE TABLE `devices_tree`  (
  `node_id` bigint(32) NOT NULL COMMENT '节点Id',
  `parent_id` bigint(32) NOT NULL COMMENT '父节点ID',
  `node_name` varchar(32) COMMENT '节点名称',
  `node_type` int(2) COMMENT '节点类型',
  `create_time` varchar(32) COMMENT '创建时间',
  `remark` varchar(255) COMMENT '备注',
  PRIMARY KEY (`node_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '树型表' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

二、代码实现

在实体类加children字段

	/**
	 * 所有子分类
	 */
	@ApiModelProperty(value = "所有子分类")
	@JsonInclude(JsonInclude.Include.NON_EMPTY)
	@TableField(exist = false)
	private List<实体类> children;
public List<Tree> lisTree() {
		//1.查出所有分类
		List<实体类> entities = baseMapper.selectList(null);
		//组成父子树型结构
		List<实体类> collect = entities.stream().filter(tree ->
			tree.getParentId() == 0
		).map((menu) -> {
			menu.setChildren(getChildren(menu, entities));
			return menu;
		}).collect(Collectors.toList());

		return collect;
	}
/**
	 * 递归查找所有菜单的子菜单
	 *
	 * @param root 父菜单——当前菜单
	 * @param all  所用菜单——子菜单
	 * @return
	 */
private List<Tree> getChildren(实体类 root, List<实体类> all) {
  	List<实体类> children = all.stream().filter(tree -> {
    	return tree.getParentId().longValue() == root.nodeId().longValue();
  	}).map(entity -> {
    //1、找到子菜单
    entity.setChildren(getChildren(entity, all));
    return entity;
  	}).collect(Collectors.toList());
  	return children;
}

三、查找当前树下的 id数组

/**
	 * 获取当前id下的菜单id树
	 * @param id 入参id
	 * @return
	 */
	@Override
	public List<Long> knowledgeIdLongList(Long id) {
		List<Long> path = new ArrayList<>();
		path.add(id);
		List<Long> paths = this.findKnowledgeIdPath(id,path);
		//路径逆序
		//Collections.reverse(paths);

		return paths;
	}

	/**
	 * 获取当前 知识节点id下的所有id数组
	 * @param knowledgeId
	 * @param path
	 * @return
	 */
	private List<Long> findKnowledgeIdPath(Long id,List<Long> path) {
		//List<Long> path = new ArrayList<>();
		List<实体类> treeList = baseMapper.selectList(new QueryWrapper<实体类>().eq("parent_id", id));
		if (treeList != null && treeList.size()>0) {
			knowledgeTreeList.forEach(tree -> {
				path.add(tree.getId());
				this.findKnowledgeIdPath(tree.getId(),path);
			});
		}
		return path;
	}

在tree表中加一个字段,可解决这个循环遍历消耗内存和查询时间问题

  ancestors         varchar(50)     default ''                 comment '祖级列表',

四、list集合转换为String以分号隔开

//使用StringUtils.collectionToDelimitedString将list集合转换为String,以分号隔开
List<String> skuAttrValues;
String skuAttrValues = StringUtils.collectionToDelimitedString(skuAttrValues, ";");
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 19:07:17  更:2022-04-22 19:08:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 10:02:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码