相关文章推荐
时尚的匕首  ·  Array.prototype.shift( ...·  8 月前    · 
不拘小节的羽毛球  ·  android ...·  1 年前    · 

JAVA项目中递归根据parentId构建树形结构,嵌套其children子节点返参给前端。获取某个根节点下所有叶子节点;获取某个根节点下叶节点(没有子节点的节点);只获取叶子节点id。

tagId为节点id;parentId为其父节点id;tagName为节点名称;children为子节点List类型。

getRootNode() 是获取所有的根节点,我们将父节点ID(parentId)为0的判为根节点。

buildChildTree() 获取所有节点集合,判断当前节点的父节点ID(parentId)是否等于根节点的ID(tagId),即当前节点为其下的子节点。再递归进行判断当前节点的情况,调用自身方法。

buildTree() 根据每个根节点来构建树形结构。

* 获取需构建的所有根节点(顶级节点) "0" * @return 所有根节点List集合 public List < TagRequestVO > getRootNode ( ) { chre // 保存所有根节点(所有根节点的数据) List < TagRequestVO > rootNodeList = new ArrayList < > ( ) ; // treeNode:查询出的每一条数据(节点) List < Tag > nodeList = tagMapper . selectList ( null ) ; for ( Tag treeNode : nodeList ) { // 判断当前节点是否为根节点, if ( treeNode . getParentId ( ) . equals ( "0" ) ) { // 是,添加 //tagId为节点id;parentId为其父节点id;tagName为节点名称 TagRequestVO response = new TagRequestVO ( ) ; response . setTagId ( treeNode . getTagId ( ) ) ; response . setTagName ( treeNode . getTagName ( ) ) ; response . setParentId ( treeNode . getParentId ( ) ) ; rootNodeList . add ( response ) ; return rootNodeList ; * 递归-----构建子树形结构 * @param pNode 根节点(顶级节点) * @return 整棵树 public TagRequestVO buildChildTree ( TagRequestVO pNode ) { List < TagRequestVO > childTree = new ArrayList < > ( ) ; // nodeList:所有节点集合(所有数据) List < Tag > nodeList = tagMapper . selectList ( null ) ; for ( Tag treeNode : nodeList ) { // 判断当前节点的父节点ID是否等于根节点的ID,即当前节点为其下的子节点 //tagId为节点id;parentId为其父节点id;tagName为节点名称 if ( treeNode . getParentId ( ) . equals ( pNode . getTagId ( ) ) ) { // 再递归进行判断当前节点的情况,调用自身方法 TagRequestVO response = new TagRequestVO ( ) ; response . setTagId ( treeNode . getTagId ( ) ) ; response . setTagName ( treeNode . getTagName ( ) ) ; response . setParentId ( treeNode . getParentId ( ) ) ; childTree . add ( buildChildTree ( response ) ) ; // for循环结束,即节点下没有任何节点,树形构建结束,设置树结果 pNode . setChildren ( childTree ) ; return pNode ; * 根据每一个顶级节点(根节点)进行构建树形结构 * @return 构建整棵树 public List < TagRequestVO > buildTree ( ) { // treeNodes:保存一个顶级节点所构建出来的完整树形 List < TagRequestVO > treeNodes = new ArrayList < > ( ) ; // getRootNode():获取所有的根节点 for ( TagRequestVO treeRootNode : getRootNode ( ) ) { // 将顶级节点进行构建子树 treeRootNode = buildChildTree ( treeRootNode ) ; // 完成一个顶级节点所构建的树形,增加进来 treeNodes . add ( treeRootNode ) ; return treeNodes ;

在没有子节点时的children会返回空数组[];如果想要为空时不反悔可以在VO加上改注释就不会返回了。

//为空不返回
@JsonInclude(JsonInclude.Include.NON_EMPTY)
//为null不返回
@JsonInclude(JsonInclude.Include.NON_NULL)

获取某节点下的所有叶子节点

树形构建与上述相差不大,只是需要在获取根节点函数(getRootNodeByTag())中加上指定筛选所需要的节点id(tagId)。子树形结构(buildChildTreeByTag())其实与上面的一模一样,构建树形后,再去匹配其下的叶子节点。

getAllChildren()获取其所有叶子节点。

getTreeTagId()获取其所有叶子节点ID(tagId)。

* 获取需构建的根节点,根据根节点tagId匹配 * @return 所有根节点List集合 public List<TagRequestVO> getRootNodeByTag(String tagId){ QueryWrapper<Tag> wrapper = new QueryWrapper<>(); wrapper.and(w -> w.eq("tag_id", tagId).or().eq("parent_id", tagId)); List<Tag> nodeList = tagMapper.selectList(wrapper); List<TagRequestVO> rootNodeList = new ArrayList<>(); for (Tag treeNode : nodeList){ TagRequestVO response = new TagRequestVO(); if (treeNode.getParentId().equals("0")) { response.setTagId(treeNode.getTagId()); rootNodeList.add(response); return rootNodeList; * 递归-----构建子树形结构 * @param pNode 根节点(顶级节点) * @return 整棵树 public TagRequestVO buildChildTreeByTag(TagRequestVO pNode){ List<TagRequestVO> childTree = new ArrayList<>(); List<Tag> nodeList = tagMapper.selectList(null); for (Tag treeNode : nodeList) { if (treeNode.getParentId().equals(pNode.getTagId())) { TagRequestVO response = new TagRequestVO(); response.setTagId(treeNode.getTagId()); response.setParentId(treeNode.getParentId()); childTree.add(buildChildTreeByTag(response)); pNode.setChildren(childTree); return pNode; * 根据每一个顶级节点(根节点)进行构建树形结构 * @return 构建整棵树 public List<TagRequestVO> buildTreeByTag(String tagId){ List<TagRequestVO> treeNodes = new ArrayList<>(); for (TagRequestVO treeRootNode : getRootNodeByTag(tagId)) { treeRootNode = buildChildTreeByTag(treeRootNode); treeNodes.add(treeRootNode); return treeNodes; //获取该节点下的所有叶子节点 private List<TagRequestVO> getAllChildren(TagRequestVO tagRequestVO,List returnList){ //获取叶子节点children List<TagRequestVO> childrenList = tagRequestVO.getChildren(); if(childrenList!=null && childrenList.size()>0){ for(TagRequestVO children : childrenList){ getAllChildren(children,returnList); returnList.add(children); return returnList; //获取该节点下的所有叶子节点tagId public List<String> getTreeTagId(String tagId){ List returnList = new ArrayList(); List<TagRequestVO> tag = getAllChildren(buildTreeByTag(tagId).get(0), returnList); List<String> tagIdList = new ArrayList<>(); for(TagRequestVO tagChildren : tag){ tagIdList.add(tagChildren.getTagId()); return tagIdList;

获取某节点下没有子节点的叶节点(没有children)

树形构建与上述相差不大,只是需要在获取根节点函数(getRootNodeByTag())中加上指定筛选所需要的节点id(tagId)。子树形结构(buildChildTreeByTag())其实与上面的一模一样,构建树形后,再去匹配其下的叶子节点。

getChildren()获取其所有的叶节点,要注意判断条件的没有children(叶子节点)。

getTreeChildrenTagId获取其所有叶节点ID(tagId)。

* 获取需构建的根节点,根据根节点tagId匹配 * @return 所有根节点List集合 public List<TagRequestVO> getRootNodeByTag(String tagId){ QueryWrapper<Tag> wrapper = new QueryWrapper<>(); wrapper.and(w -> w.eq("tag_id", tagId).or().eq("parent_id", tagId)); List<Tag> nodeList = tagMapper.selectList(wrapper); List<TagRequestVO> rootNodeList = new ArrayList<>(); for (Tag treeNode : nodeList){ TagRequestVO response = new TagRequestVO(); if (treeNode.getParentId().equals("0")) { response.setTagId(treeNode.getTagId()); rootNodeList.add(response); return rootNodeList; * 根据每一个顶级节点(根节点)进行构建树形结构 * @return 构建整棵树 public List<TagRequestVO> buildTreeByTag(String tagId){ List<TagRequestVO> treeNodes = new ArrayList<>(); for (TagRequestVO treeRootNode : getRootNodeByTag(tagId)) { treeRootNode = buildChildTreeByTag(treeRootNode); treeNodes.add(treeRootNode); return treeNodes; * 递归-----构建子树形结构 * @param pNode 根节点(顶级节点) * @return 整棵树 public TagRequestVO buildChildTreeByTag(TagRequestVO pNode){ List<TagRequestVO> childTree = new ArrayList<>(); List<Tag> nodeList = tagMapper.selectList(null); for (Tag treeNode : nodeList) { if (treeNode.getParentId().equals(pNode.getTagId())) { TagRequestVO response = new TagRequestVO(); response.setTagId(treeNode.getTagId()); response.setParentId(treeNode.getParentId()); childTree.add(buildChildTreeByTag(response)); pNode.setChildren(childTree); return pNode; //获取该节点下 没有子节点的(没有children) 叶子节点 private List<TagRequestVO> getChildren(TagRequestVO tagRequestVO,List returnList){ List<TagRequestVO> childrenList = tagRequestVO.getChildren(); // 退出递归的条件 只有一层维度结构 if(childrenList==null || childrenList.size()<=0){ returnList.add(tagRequestVO); }else{ // 有多层维度结果 for(TagRequestVO children : childrenList){ getChildren(children,returnList); return returnList; //获取该节点下 没有子节点的(没有children) 叶子节点的tagId public List<String> getTreeChildrenTagId(String tagId){ List returnList = new ArrayList(); List<TagRequestVO> tag = getChildren(buildTreeByTag(tagId).get(0), returnList); List<String> childrenTagIdList = new ArrayList<>(); for(TagRequestVO tagChildren : tag){ childrenTagIdList.add(tagChildren.getTagId()); return childrenTagIdList;

参考:https://blog.csdn.net/a18505947362/article/details/122458089

https://blog.csdn.net/weixin_36368404/article/details/115783785?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-13-115783785-blog-124102788.pc_relevant_multi_platform_whitelistv4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-13-115783785-blog-124102788.pc_relevant_multi_platform_whitelistv4&utm_relevant_index=14

JAVA项目中递归根据parentId构建树形结构,嵌套其children子节点返参给前端。获取某个根节点下所有叶子节点;获取某个根节点下叶节点(没有子节点的节点);只获取叶子节点id。
// 获取节点下的所有叶子节点 function getAllChildrenNodes(treeNode, result) { if (treeNode.isParent) { var childrenNodes = treeNode.children; if (childrenNodes) { for (var i = 0; i < childrenNodes.length; i++) {
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。 意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单
if (node.children) { for (let i = 0; i < node.children.length; i++) { let found = findNode(node.children[i], targetId); if (found) { return found; return null; 这段代码中,`findNode` 是一个归函数,它接受两个数:当前节点和目标节点的 ID。在函数中,如果当前节点的 ID 与目标节点的 ID 相同,则回当前节点。否则,如果当前节点节点,则对于每一个节点都调用 `findNode` 函数,并检查它的回值。如果找到了目标节点,则回该节点;否则回 null。 这个示例假设你的树形结构是一个对象, 这个对象有一个ID和children属性, 也可以根据具体需要修改成其他的. ### 回答2: 下面是一个使用归查找树形结构下某一个节点的 JavaScript 函数: ```javascript function findNode(tree, targetId) { // 遍历树的函数 function traverseNode(node) { // 如果当前节点的id等于目标id,则回当前节点 if (node.id === targetId) { return node; // 遍历当前节点节点 for (let i = 0; i < node.children.length; i++) { // 归调用遍历函数,查找节点 const foundNode = traverseNode(node.children[i]); // 如果找到了目标节点,则回该节点 if (foundNode !== null) { return foundNode; // 如果没有找到目标节点,则回null return null; // 调用归函数,从根节点开始查找 return traverseNode(tree); 这个函数接收两个数,`tree` 表示树形结构的根节点,`targetId` 表示目标节点的id。首先定义了一个内部归函数 `traverseNode`,用来遍历节点并查找目标节点。在遍历函数中,首先检查当前节点的id是否等于目标id,如果是则回当前节点。然后遍历当前节点节点,对每个节点归调用遍历函数,查找节点中是否存在目标节点。如果找到,则回该节点。如果遍历完所有节点都没有找到目标节点,则回null。最后,在外部调用中,调用遍历函数,从根节点开始查找。如果找到目标节点,则回该节点,否则回null。 ### 回答3: JavaScript归查找树形结构下的某一节点可以通过以下步骤实现: 1. 首先,定义一个归函数,接收两个数:要查询的节点id和一个树形结构的数据。假设我们的树形结构数据是一个对象数组,每个对象都有一个唯一的id和一个children属性,存储了该节点节点。 2. 在归函数中,首先遍历树形结构数据数组。可以使用for循环或者Array.prototype.forEach()方法来实现。 3. 对于每一个数据对象,首先判断当前节点的id是否等于要查询的节点id。如果等于,则找到了目标节点,可以回该节点。 4. 如果当前节点的id不等于要查询的节点id,则继续归调用该函数,在当前节点节点(children)数组上进行遍历,传入要查询的节点id和节点数组作为数。 5. 对于每一个节点对象,再次执行步骤3和步骤4,直到遍历完整个树形结构,或者找到目标节点为止。 6. 如果在整个树形结构中未找到目标节点,则回null或者其他指定的未找到标识。 示例代码如下: ```javascript function findNode(id, data) { for (var i = 0; i < data.length; i++) { if (data[i].id === id) { return data[i]; // 找到目标节点 } else if (data[i].children && data[i].children.length > 0) { var result = findNode(id, data[i].children); // 归在节点中查找 if (result) { return result; // 在节点中找到了目标节点 return null; // 未找到目标节点 以上代码中,我们传入要查询的节点id和树形结构数据数组,例如`findNode(3, data)`,其中`data`是树形结构数据。函数会归查找并回具有指定id的节点对象,如果找不到则回null。
【解决问题】RLException: [xx.launch] is neither a launch file in package [x] nor is [x] a launch file name 54361 【解决问题】python编译报错 Target is multiclass but average='binary'. Please choose another average setting 28927
【解决问题】RLException: [xx.launch] is neither a launch file in package [x] nor is [x] a launch file name zzzzz255: 实测添加第一条就好了,把第二条添加进去会报错 Matlab-对音频文件(.wav)中的一段(1-2s)进行傅里叶变换并显示频谱 茉莉Jasmine0217: 请问楼主傅里叶变换的时间是固定1-2秒吗 【解决问题】xcrun: error: invalid active developer path (/Library/Developer/..), missing xcrun at Bywinkey: 亲测不需要安装xcode(如果你不用这个软件的话) 我重新安装了git之后,就可以使用了