这几天在写一个外快,而写之前的TT随笔比较耗时,故先搁着。
前天写了一个树生成器,感觉还是挺不错的,相对来说还是比较灵活的,代码也比较简单。
先贴上生成器的代码:
package com.tt.pub.utils; import java.util.List; import java.util.Stack; /** * Desc:树生成工具。 * @author Small * @Email 536762164@qq.com * @since 2013-6-14 * */ public class TreeGen { /** * Desc:树生成模板。 * @author Small * @Email 536762164@qq.com * @since 2013-6-14 * * @param <E> * @param <V> */ public static interface ITreeTmp<E, V> { /** * Desc:将源对象转换为目标对象(树节点)。 * @author Small * @Email 536762164@qq.com * @since 2013-6-14 * * @param src * @return */ public V trans(E src); /** * Desc:是否将当前node入栈?如果入栈,请记得为节点构造父子关系。 * @author Small * @Email 536762164@qq.com * @since 2013-6-14 * * @param node * @param lastNode * @return */ public boolean isPush(V node, V lastNode); } /** * Desc:通过有一定规律的数组(请先进行排序),构建树数组。 * @author Small * @Email 536762164@qq.com * @since 2013-6-14 * * @param srcList * @param tmp * @return */ public static <E, V> List<V> gen(List<E> srcList, ITreeTmp<E, V> tmp){ List<V> treeList = CollUtils.newArrayList(); Stack<V> stack = CollUtils.newStack(); for(int i = 0; i < srcList.size(); ++i){ E src = srcList.get(i); V node = tmp.trans(src); if(stack.size() == 0){//如果栈为空,则为树根 treeList.add(node);//添加为根节点 stack.push(node);//当前元素进栈 continue; } while(stack.size() > 0){//进行栈操作 V lastNode = stack.lastElement();//取顶级元素进行比较 if(tmp.isPush(node, lastNode)) { stack.push(node);//当前元素进栈 break; } else stack.pop();//未匹配到则出栈 } } return treeList; } }
所需要的数据格式如下:
var menuInfos = [{ id : "menu001" },{ id : "menu001001" },{ id : "menu001002" },{ id : "menu001002001" },{ id : "menu002" },{ id : "menu002001" }];
数据按一定顺序排列,并且有一定规则。
使用的范例如下:
先创建一个模板,模板需要实现TreeGen中的ITreeTmp接口:
package com.tt.pvl.tmp; import com.tt.pub.utils.TreeGen.ITreeTmp; import com.tt.pvl.pojo.Pvl; import com.tt.pvl.pojo.TreeNode4EUi; /** * Desc:菜单树模板。 * @author Small * @Email 536762164@qq.com * @since 2013-6-14 * */ public class MenuTreeTmp implements ITreeTmp<Pvl, TreeNode4EUi> { @Override public TreeNode4EUi trans(Pvl src) { TreeNode4EUi node = new TreeNode4EUi(); node.setId(src.getCode()); node.setText(src.getName()); node.setUrl(src.getContent()); return node; } @Override public boolean isPush(TreeNode4EUi node, TreeNode4EUi lastNode) { if(!node.getId().startsWith(lastNode.getId())) return false; lastNode.addChild(node);//构建树层级关系 return true; } }
调用方式:
List<Pvl> menus = pvlService.getByType(PvlConst.PVL_TYPE_MENU); List<TreeNode4EUi> treeList = TreeGen.gen(menus, new MenuTreeTmp());
大概的思路是运用了栈来进行操作:
如果栈为空,那么当前元素就作为根节点;
如果当前元素是栈最后一个节点的子节点,则创建父子关系,并将当前节点推入栈;
如果当前元素不是是栈最后一个节点的子节点,则将元素出栈,继续循环,知道创建父子关系或者栈为空。
后记:
实在惭愧,没有测试完整,指测试了树列表个数为1的,后面测试的时候才发现了bug。其实只要把TreeGen的gen方法中的循环部分的代码对调下就行了~~代码如下:
public static <E, V> List<V> gen(List<E> srcList, ITreeTmp<E, V> tmp){ List<V> treeList = CollUtils.newArrayList(); Stack<V> stack = CollUtils.newStack(); for(int i = 0; i < srcList.size(); ++i){ E src = srcList.get(i); V node = tmp.trans(src); while(stack.size() > 0){//进行栈操作 V lastNode = stack.lastElement();//取顶级元素进行比较 if(tmp.isPush(node, lastNode)) { stack.push(node);//当前元素进栈 break; } else stack.pop();//未匹配到则出栈 } if(stack.size() == 0){//如果栈为空,则为树根 treeList.add(node);//添加为根节点 stack.push(node);//当前元素进栈 continue; } } return treeList; }
相关推荐
标题“百度网盘目录树生成器v2.0版本”涉及到的是一个专为百度网盘设计的工具,其主要功能是帮助用户生成网盘内的目录树结构。这个工具是基于Python编程语言编写的,并且已经打包为Windows可执行文件(exe),方便在...
SketchUP插件 Tree Maker (树木生成器) SU 草图大师 不会安装插件的可自行查找下教程很简单的
"文件目录树生成器"是一种实用工具,它能够帮助用户快速地整理和记录计算机中某个特定目录下的所有文件和子目录结构。这个程序通常用于批量处理文件管理任务,例如在备份、迁移或分析大量文件时,能清晰地了解文件...
这个程序是一个文件夹目录树生成器,它可以帮助你生成文件夹的目录树并保存到TXT文本文件中。主要功能如下: 选择文件夹:你可以通过点击菜单栏中的“文件”菜单,然后选择文件夹来指定要生成目录树的文件夹路径。...
分形树生成器是一款在Visual Studio 2003 .Net环境下开发的程序,它主要展示了如何通过编程实现不同类型的递归分形树算法。在计算机图形学领域,分形是一种具有自相似性质的几何形态,它在不同尺度上重复出现相同的...
Delphi 抽象语法树生成器
非常适合做虚拟产品的用户购买,提升自己的购买率!...一共有两个软件,第一个将百度网盘的目录导出成txt格式的目录树,第二个软件将txt的内容快速生成有折叠功能的目录的网页,上传到服务器后方便查看。
DelphiAST, Delphi抽象语法树生成器 Delphi的抽象语法树生成器使用 DelphiAST,你可以使用真正的Delphi代码并获得抽象语法树。 一个单位,但没有符号表。FreePascal和and兼容。示例输入unit Unit1;interfac
该生成器可以根据用户的要求生成任何用户所需要的类型的二叉树
在“attackTrees:Chrome的视觉攻击树生成器”项目中,开发者创建了一个概念验证版本,专注于利用JavaScript技术在Chrome浏览器环境中构建攻击树模型。 攻击树通常由根节点、分支节点和叶节点组成,根节点代表主要的...
而“百度网盘生成目录树结构”则是一种优化资源管理的方法,尤其对站长和内容创作者而言,能够更清晰地展示文件的层级关系,提高工作效率。 首先,我们要理解什么是目录树结构。目录树结构是计算机科学中的一个基本...
在IT领域,树形目录菜单生成器是一种常见且实用的工具,尤其在Web开发中,用于构建层次清晰、易于导航的菜单系统。本项目提供的是一款JavaScript版本的树形目录菜单生成器,它可以帮助开发者轻松地将层级结构的数据...
在本案例中,我们有两个BAT文件:`cmdtree.bat`和`目录树生成器.bat`。 `cmdtree.bat`是一个简单的目录树生成程序,它默认在D盘根目录生成一个名为`tree.txt`的文本文件,用于保存生成的目录树结构。使用这个程序时...
在本案例中,这两个bat脚本(目录树生成器(xls版).bat和目录树生成器(txt版).bat)是用来遍历指定文件夹内的所有子文件夹和文件,并将结果分别以xls(Excel表格)和txt(纯文本)格式输出。 txt版的目录树生成器...
改进的树苗生成器Blenders树苗树生成器附加组件的新版本,具有改进,新功能和错误修复对于Blender 2.7: add_curve_sapling_3 对于Blender 2.8: add_curve_sapling_3_2_8 最新: sapling_4新的替代版本“ sapling_4...
本篇文章将深入探讨如何使用特定的软件工具来高效地生成并编辑百度网盘的文件和文件夹的树形目录结构。 首先,标题提到的“百度网盘文件夹目录生成软件”是一个专门设计用于自动化生成百度网盘内文件和文件夹结构的...
RandTree是一个基于MatLab的树模拟器程序,... 为了模拟视觉逼真的树结构,我们使用了概率的分支生成。 该程序旨在生成具有分支分支模式(渐进式分支)的分支结构。 通过更改概率和分支角度,可以生成不同形状的树。
:package:项目树生成器project-tree-generator:package:项目树生成器播放以单击:bullseye:屏幕快照功能1>输入项目树和复制树功能2>通过github存储库生成树( )和分支(主)复制树博客velog-후기