论坛首页 Web前端技术论坛

java 列表转树形

浏览 7613 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-02-01  

往往要将数据库中的菜单配置转成树形结构展示到前台,这边提供一种二维树组转树形(同事那边看来的,很好用),以供参考:

数据库  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
   发表时间:2013-02-04  
...................这也算前端,木有人管理的论坛就是如此.....................。这样的贴子发出来也有意义?
0 请登录后投票
   发表时间: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元素
0 请登录后投票
   发表时间:2013-02-04  
其实这个问题考的就是树型算法,怎么构建树的问题。属于基础问题。
之前我的做法是:
构建一个特定的Root,然后对这个以Root为根的基础树,进行判定,每读取一个新的数据就在树中搜索对应的结点,然后嫁接过去。搜索方式多种:广度、深度以及前、中、后序。
0 请登录后投票
   发表时间:2013-02-04  
wothnet 写道
...................这也算前端,木有人管理的论坛就是如此.....................。这样的贴子发出来也有意义?

这个归为算法的东东吧,一般做web的经常要搞这种事。
看分类也就这比较贴近,只是想把自己觉得方便的东东分享给大家下而已。
如果还算凑合,那是收获,如果觉得不行,可以提出更好的。
请勿动怒,木有必要~
0 请登录后投票
   发表时间:2013-02-04  
freezingsky 写道
其实这个问题考的就是树型算法,怎么构建树的问题。属于基础问题。
之前我的做法是:
构建一个特定的Root,然后对这个以Root为根的基础树,进行判定,每读取一个新的数据就在树中搜索对应的结点,然后嫁接过去。搜索方式多种:广度、深度以及前、中、后序。

楼上的两个都要做递归遍历,以前我也这么写的,相比这下,我觉得我那个可能会更简单一些,少写了一个递归遍历的方法
0 请登录后投票
   发表时间:2013-02-06  
5555555. 大神们这么简单就做出来了, 这个树我至今都没想出来怎么构建出来...

55555555555555

55555555555555

555555555555555555

55555555555555555555
0 请登录后投票
   发表时间:2013-02-06  
为什么不考虑用递归实现呢?感觉递归逻辑更好理解点、效率也更快点
0 请登录后投票
   发表时间:2013-02-07  
有点意思的!!简单便捷!!
0 请登录后投票
   发表时间:2013-02-07  
要用 TreeNode 可以去看看SWING的 TreeNode,不过里面涉及了节点展开和显示的MVC框架,对于Web上的节点 看要一次加载还是异步加载

一次加载,像你这样就可以了。

异步加载,每次返回的只是父节点下面的节点,最好不要用  private List<TreeNode> children; 属性,这样关联太多,如果节点很多还是查资料库或节点资料,返回List<TreeNode> 就可以了。

还需要设计其他一些属性:
是否有复选框
复选框是否已勾选
是否还有子节点
是否被选中
节点是否被展开
等等

根據頁面Tree的样子,属性还是需要添加的。

另:在Oracle数据库查询树状结构可以使用connect by 一次全部读取。


0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics