- fireinjava
- 等级: 初级会员
- 性别:
- 文章: 28
- 积分: 80
- 来自: 福州
|
往往要将数据库中的菜单配置转成树形结构展示到前台,这边提供一种二维树组转树形(同事那边看来的,很好用),以供参考:
数据库 id,name,parent_id
java对象:
private class TreeNode{
private String id;
private String name;
private String parentId;
private List<TreeNode> children;
// TODO getter/setter
}
树构造代码如下:
List<TreeNode> menuList = xxManager.findAllMenu();
List<TreeNode> nodeList = new ArrayList<TreeNode>();
for(TreeNode node1 : menuList){
boolean mark = false;
for(TreeNode node2 : menuList){
if(node1.getParentId()!=null && node1.getParentId().equals(node2.getId())){
mark = true;
if(node2.getChildren() == null)
node2.setChildren(new ArrayList<TreeNode>());
node2.getChildren().add(node1);
break;
}
}
if(!mark){
nodeList.add(node1);
}
}
//转为json格式
String json = JSONArray.fromObject(treeList).toString();
System.out.println("json:"+json);
原理如下图了:
- 大小: 6.7 KB
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
返回顶楼 |
|
|
- wothnet
- 等级: 初级会员
- 性别:
- 文章: 26
- 积分: 30
- 来自: 广州
|
...................这也算前端,木有人管理的论坛就是如此.....................。这样的贴子发出来也有意义?
|
返回顶楼 |
|
|
- mengxianming
- 等级: 初级会员
- 性别:
- 文章: 3
- 积分: 30
- 来自: 上海
|
发表时间:2013-02-04
最后修改:2013-02-04
这个问题以前开发也遇见过。
我说说我的算法吧。
1.遍历一遍List,得到<id,TreeNode>的Map
2.再遍历一遍List
2.1 对每一个元素,根据它的parentID查询上述Map得到其父亲结点。
2.2 若当前元素的父亲结点为Null,则它自身问Root元素
2.3 若可以得到父亲结点,把当前元素加入到父亲结点的childrenList里面
3. 返回root元素
|
返回顶楼 |
|
|
- freezingsky
- 等级: 初级会员
- 文章: 263
- 积分: 40
|
其实这个问题考的就是树型算法,怎么构建树的问题。属于基础问题。 之前我的做法是: 构建一个特定的Root,然后对这个以Root为根的基础树,进行判定,每读取一个新的数据就在树中搜索对应的结点,然后嫁接过去。搜索方式多种:广度、深度以及前、中、后序。
|
返回顶楼 |
|
|
- fireinjava
- 等级: 初级会员
- 性别:
- 文章: 28
- 积分: 80
- 来自: 福州
|
wothnet 写道 ...................这也算前端,木有人管理的论坛就是如此.....................。这样的贴子发出来也有意义?
这个归为算法的东东吧,一般做web的经常要搞这种事。
看分类也就这比较贴近,只是想把自己觉得方便的东东分享给大家下而已。
如果还算凑合,那是收获,如果觉得不行,可以提出更好的。
请勿动怒,木有必要~
|
返回顶楼 |
|
|
- fireinjava
- 等级: 初级会员
- 性别:
- 文章: 28
- 积分: 80
- 来自: 福州
|
freezingsky 写道 其实这个问题考的就是树型算法,怎么构建树的问题。属于基础问题。
之前我的做法是:
构建一个特定的Root,然后对这个以Root为根的基础树,进行判定,每读取一个新的数据就在树中搜索对应的结点,然后嫁接过去。搜索方式多种:广度、深度以及前、中、后序。
楼上的两个都要做递归遍历,以前我也这么写的,相比这下,我觉得我那个可能会更简单一些,少写了一个递归遍历的方法
|
返回顶楼 |
|
|
- howareyouo
- 等级: 初级会员
- 性别:
- 文章: 1
- 积分: 30
|
5555555. 大神们这么简单就做出来了, 这个树我至今都没想出来怎么构建出来...
55555555555555
55555555555555
555555555555555555
55555555555555555555
|
返回顶楼 |
|
|
- operation110
- 等级: 初级会员
- 性别:
- 文章: 7
- 积分: 30
- 来自: 成都
|
为什么不考虑用递归实现呢?感觉递归逻辑更好理解点、效率也更快点
|
返回顶楼 |
|
|
- jacking124
- 等级: 初级会员
- 性别:
- 文章: 59
- 积分: 60
- 来自: 新疆
|
有点意思的!!简单便捷!!
|
返回顶楼 |
|
|
- nick.s.ni
- 等级: 初级会员
- 性别:
- 文章: 67
- 积分: 30
- 来自: 上海
|
要用 TreeNode 可以去看看SWING的 TreeNode,不过里面涉及了节点展开和显示的MVC框架,对于Web上的节点 看要一次加载还是异步加载
一次加载,像你这样就可以了。
异步加载,每次返回的只是父节点下面的节点,最好不要用 private List<TreeNode> children; 属性,这样关联太多,如果节点很多还是查资料库或节点资料,返回List<TreeNode> 就可以了。
还需要设计其他一些属性: 是否有复选框 复选框是否已勾选 是否还有子节点 是否被选中 节点是否被展开 等等
根據頁面Tree的样子,属性还是需要添加的。
另:在Oracle数据库查询树状结构可以使用connect by 一次全部读取。
|
返回顶楼 |
|
|