直接上代码,代码里面的注释能够讲清楚代码用意。
import com.alibaba.fastjson.JSONArray;
import java.util.ArrayList;
import java.util.List;
/**
* Created by F.S.ZH on 2017/3/8.
*/
public class RecursionMain {
public static void main(String[] args) {
/*以下的代码用于生成一个长度为20的平滑list(用pid表示父节点),模拟从二维数据表里面查询数据表里面查询的数据*/
List<MetadataModel> metadataModelList = new ArrayList<MetadataModel>();
for (int i = 0; i < 20 ; i++) {
MetadataModel metadata = new MetadataModel();
metadata.setId(String.valueOf(i));
if (i != 0 && i != 1) {
if (i != 0 && i % 5 == 0) {
metadata.setParentId("4");
} else if (i != 0 && i % 4 == 0) {
metadata.setParentId("0");
} else if (i != 0 && i % 7 == 0) {
metadata.setParentId("1");
} else {
metadata.setParentId("7");
}
}
// System.out.println(metadata.getId() + "," + metadata.getParentId() + ";");
metadataModelList.add(metadata);
}
/*以下代码用于取出最顶级节点*/
List<TreeModel> newTreeList = new ArrayList<TreeModel>();
for (int i = 0; i < metadataModelList.size(); i++) {
if (metadataModelList.get(i).getParentId() == null){
TreeModel newTreeModel = new TreeModel();
newTreeModel.setId(metadataModelList.get(i).getId());
newTreeModel.setChildren(null);
newTreeList.add(newTreeModel);
}
}
/*以下代码用于获取除顶级节点外的所有节点*/
List<TreeModel> paramTree = new ArrayList<TreeModel>();
for (int i = 0; i < metadataModelList.size(); i++) {
if (metadataModelList.get(i).getParentId() != null) {
TreeModel paramTreeModel = new TreeModel();
paramTreeModel.setId(metadataModelList.get(i).getId());
paramTreeModel.setParentid(metadataModelList.get(i).getParentId());
paramTree.add(paramTreeModel);
}
}
/*为了看到更好的效果,加上第四级节点*/
TreeModel addLevel = new TreeModel();
addLevel.setId("21");
addLevel.setParentid("5");
paramTree.add(addLevel);
/*生成最终的树形list(包含list的list)*/
List<TreeModel> finalTree = new ArrayList<TreeModel>();
for (int i = 0; i < newTreeList.size(); i++) {
finalTree.add(recursionChildren(newTreeList.get(i), paramTree));
}
/*将list转换成json字符串,用到ali的fastjosn,是一个比较好用的java json工具*/
JSONArray js = new JSONArray();
js.addAll(finalTree);
System.out.println(js.toJSONString());
}
/**
* 将平滑的list转换成树形list,主要用到递归
* @param treeModel
* @param list
* @return
*/
public static TreeModel recursionChildren(TreeModel treeModel, List<TreeModel> list){
/*如果一个节点的父id等于参数节点的id,则把这个节点写入参数节点的子节点list*/
List<TreeModel> children = new ArrayList<TreeModel>();
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getParentid().equals(treeModel.getId())) {
children.add(list.get(i));
}
}
/*如果子节点list中有对象存在,则用递归去寻找子节点的子节点,直到不再有子节点*/
List<TreeModel> param = new ArrayList<TreeModel>();
for (TreeModel childTree : children) {
TreeModel grandChild = recursionChildren(childTree,list);
param.add(grandChild);
}
/*最终返回传进来的带有所有子节点的参数节点*/
treeModel.setChildren(param);
return treeModel;
}
}
为了代码的完整性,我把pojo代码也贴上
/**
* Created by F.S.ZH on 2017/3/8.
* 用于生成平滑的带有父id的list
*/
public class MetadataModel {
private String id;
private String parentId;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
}
import java.util.List;
/**
* Created by F.S.ZH on 2017/3/8.
* 用于最终生成树形list
*/
public class TreeModel {
private String id;
private String parentid;
private List<TreeModel> children;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getParentid() {
return parentid;
}
public void setParentid(String parentid) {
this.parentid = parentid;
}
public List<TreeModel> getChildren() {
return children;
}
public void setChildren(List<TreeModel> children) {
this.children = children;
}
}