Tree结构数据拆分成List集合算法
2015-07-17 13:14
204 查看
前段时间做项目,遇到了一个将Tree型结构的数据转换成一条条的数据。
首先,肯定是用List集合来接收数据,其次,既然是Tree型结构的数据,肯定是类似于找路径了哈。
最后,是利用递归,从根节点开始查找,先查找到节点的最后一个子节点,然后数据从最后一个子节点开始往添加。
//-------------实体类-----------------
package com.iodn.util;
import java.util.List;
public class Node {
private String name;
private List<Node> list;
public Node(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Node> getList() {
return list;
}
public void setList(List<Node> list) {
this.list = list;
}
}
//--------------------Tree拆分成List的算法
package com.iodn.util;
import java.util.ArrayList;
import java.util.List;
public class TreeToList {
/**
*/
public static void main(String[] args) {
TreeToList t = new TreeToList();
Node root = t.getNode();
List<List<Node>> list = t.hbzhang_digui(root);
System.out.println(list.size());
}
/**
* 组织构造Tree型的结构数据
* @return
*/
public Node getNode() {
Node a = new Node("a");
Node b = new Node("b");
Node c = new Node("c");
List<Node> list_a = new ArrayList<Node>();
list_a.add(b);
list_a.add(c);
Node b1 = new Node("b1");
Node b2 = new Node("b2");
Node c1 = new Node("c1");
Node c2 = new Node("c2");
Node d1 = new Node("d1");
List<Node> list_c2 = new ArrayList<Node>();
list_c2.add(d1);
c2.setList(list_c2);
List<Node> list_b = new ArrayList<Node>();
List<Node> list_c = new ArrayList<Node>();
list_b.add(b1);
list_b.add(b2);
b.setList(list_b);
list_c.add(c1);
list_c.add(c2);
c.setList(list_c);
a.setList(list_a);
return a;
}
/**
* 递归从找出每一条Tree的路径
* @param node
* @return
*/
public List<List<Node>> hbzhang_digui(Node node){
List<List<Node>> list=new ArrayList<List<Node>>();
List<Node> childrenList=node.getList();
if(childrenList==null || childrenList.size()==0){
List<Node> temp=new ArrayList<Node>();
temp.add(node);
list.add(temp);
}else{
for(int i=0;i<childrenList.size();i++){
Node n=childrenList.get(i);
List<List<Node>> c_list=this.hbzhang_digui(n);
for(int j=0;j<c_list.size();j++){
List<Node> temp=c_list.get(j);
temp.add(0,node);
list.add(temp);
}
}
}
return list;
}
}
首先,肯定是用List集合来接收数据,其次,既然是Tree型结构的数据,肯定是类似于找路径了哈。
最后,是利用递归,从根节点开始查找,先查找到节点的最后一个子节点,然后数据从最后一个子节点开始往添加。
//-------------实体类-----------------
package com.iodn.util;
import java.util.List;
public class Node {
private String name;
private List<Node> list;
public Node(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Node> getList() {
return list;
}
public void setList(List<Node> list) {
this.list = list;
}
}
//--------------------Tree拆分成List的算法
package com.iodn.util;
import java.util.ArrayList;
import java.util.List;
public class TreeToList {
/**
*/
public static void main(String[] args) {
TreeToList t = new TreeToList();
Node root = t.getNode();
List<List<Node>> list = t.hbzhang_digui(root);
System.out.println(list.size());
}
/**
* 组织构造Tree型的结构数据
* @return
*/
public Node getNode() {
Node a = new Node("a");
Node b = new Node("b");
Node c = new Node("c");
List<Node> list_a = new ArrayList<Node>();
list_a.add(b);
list_a.add(c);
Node b1 = new Node("b1");
Node b2 = new Node("b2");
Node c1 = new Node("c1");
Node c2 = new Node("c2");
Node d1 = new Node("d1");
List<Node> list_c2 = new ArrayList<Node>();
list_c2.add(d1);
c2.setList(list_c2);
List<Node> list_b = new ArrayList<Node>();
List<Node> list_c = new ArrayList<Node>();
list_b.add(b1);
list_b.add(b2);
b.setList(list_b);
list_c.add(c1);
list_c.add(c2);
c.setList(list_c);
a.setList(list_a);
return a;
}
/**
* 递归从找出每一条Tree的路径
* @param node
* @return
*/
public List<List<Node>> hbzhang_digui(Node node){
List<List<Node>> list=new ArrayList<List<Node>>();
List<Node> childrenList=node.getList();
if(childrenList==null || childrenList.size()==0){
List<Node> temp=new ArrayList<Node>();
temp.add(node);
list.add(temp);
}else{
for(int i=0;i<childrenList.size();i++){
Node n=childrenList.get(i);
List<List<Node>> c_list=this.hbzhang_digui(n);
for(int j=0;j<c_list.size();j++){
List<Node> temp=c_list.get(j);
temp.add(0,node);
list.add(temp);
}
}
}
return list;
}
}
相关文章推荐
- OpenCV入门指南
- 利用BGP origin-code 属性修改BGP选路
- 美团和大众点评的O2O之困
- [BZOJ2200][Usaco2011 Jan]道路和航线
- 关于网络中的内网IP地址和公网IP地址
- KVC简单介绍 -字典转模型,模型转字典
- hdu 2191 (多重背包的单调队列优化)
- 解题报告:置换的玩笑
- 分形之螺线
- (转)C#4.0的dynamic和var及object关键字辨析
- YII 数据库操作之DAO
- Springmvc+mybatis+maven查询分页完美封装版
- sqlmap在渗透测试中使用方法
- sleep() 和 wait() 的区别
- 基础知识学习笔记(一)
- Network:UDP广播消息的测试
- 吐槽LodopWeb端打印控件
- Nginx_handler模块发开(hello模块结构解析)
- 简易版qq-----
- Redis数据类型--key